it-swarm.com.ru

как удалить подпредставления из прокрутки?

как удалить все подпредставления из моего прокрутки ...

у меня есть uiview и кнопка над ним в scrollview что-то вроде этого ....

вот мой код, чтобы добавить подпредставление в представлении прокрутки

-(void)AddOneButton:(NSInteger)myButtonTag {
lastButtonNumber = lastButtonNumber + 1;

if ((lastButtonNumber == 1) || ((lastButtonNumber%2) == 1)) {
btnLeft = 8;}
else if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) {
btnLeft = 162;
}
CGRect frame1 = CGRectMake(btnLeft, btnTop, 150, 150);
CGRect frame2 = CGRectMake(btnLeft, btnTop, 150, 150);
UIButton *Button = [UIButton buttonWithType:UIButtonTypeCustom];
Button.frame = frame1;
Button.tag = myButtonTag;
[Button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
[Button setBackgroundColor:[UIColor clearColor]];
[Button setBackgroundImage:[UIImage imageNamed:@"WaitScreen.png"] forState:UIControlStateHighlighted];

    GraphThumbViewControllerobj = [[GraphThumbViewController alloc] initWithPageNumber:[[GraphIdArray objectAtIndex:myButtonTag]intValue]];
    GraphThumbViewControllerobj.view.frame=frame2;
    GraphThumbViewControllerobj.lblCounter.text=[NSString stringWithFormat:@"%d of %d",myButtonTag+1,flashCardsId.count];
    GraphThumbViewControllerobj.lblQuestion.text=[flashCardText objectAtIndex:myButtonTag];
    [myScrollView addSubview:GraphThumbViewControllerobj.view];


[myScrollView addSubview:Button];


if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) {
btnTop = btnTop + 162;
}
if (btnTop+150 > myScrollView.frame.size.height) {
myScrollView.contentSize = CGSizeMake((myScrollView.frame.size.width), (btnTop+160));}
}

а вот код для удаления подпредставлений

if(myScrollView!=nil)
{
        while ([myScrollView.subviews count] > 0) {
            //NSLog(@"subviews Count=%d",[[myScrollView subviews]count]);
            [[[myScrollView subviews] objectAtIndex:0] removeFromSuperview];
}

альтернативный текст http://www.freeimagehosting.net/uploads/e5339a1f51.png

32
Rahul Vyas

Чтобы удалить все подпредставления из любого представления, вы можете перебирать подпредставления и отправлять каждый вызов removeFromSuperview:

// With some valid UIView *view:
for(UIView *subview in [view subviews]) {
    [subview removeFromSuperview];
}

Это совершенно безоговорочно, и избавит от всех подпредставлений в данном представлении. Если вы хотите что-то более детальное, вы можете выбрать один из нескольких подходов:

  • Поддерживайте свои собственные массивы представлений разных типов, чтобы вы могли отправлять им сообщения removeFromSuperview позже таким же образом.
  • Сохраните все свои представления там, где вы их создали, и держите указатели на эти представления, чтобы вы могли отправлять их removeFromSuperview по мере необходимости
  • Добавьте оператор if в вышеприведенный цикл, проверяя равенство классов. Например, чтобы удалить только все UIButton (или пользовательские подклассы UIButton), которые существуют в представлении, вы можете использовать что-то вроде:
// Again, valid UIView *view:
for(UIView *subview in [view subviews]) {
    if([subview isKindOfClass:[UIButton class]]) {
        [subview removeFromSuperview];
    } else {
        // Do nothing - not a UIButton or subclass instance
    }
}
103
Tim

Старый вопрос; но так как это первый хит в Google для этого, я подумал, что я бы также отметил, что есть также этот метод:

[[myScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

Вы не можете выполнить проверку isKindOfClass с этим, но это все еще хорошее решение, чтобы знать о.

Правка: еще один момент, на который следует обратить внимание, это то, что полоса прокрутки в виде прокрутки добавляется как подпредставление для этого вида прокрутки. Таким образом, если вы перебираете все подпредставления прокрутки, вы встретите его. Если он будет удален, он снова добавится, но важно знать это, если вы ожидаете, что ваши собственные подклассы UIView будут там.

Поправка к Swift 3:

myScrollView.subviews.forEach { $0.removeFromSuperview() }
37
Wex

Чтобы добавить к тому, что сказал Тим, я заметил, что вы помечаете свои взгляды. Если вы хотите удалить вид с определенным тегом, вы можете использовать:

[[myScrollView viewWithTag:myButtonTag] removeFromSuperview];
9
Terry Blanchard

Я не думаю, что вы должны использовать предложение быстрого перечисления.

for(UIView *subview in [view subviews]) {
   [subview removeFromSuperview];
}

Разве это не должно вызывать исключение, если вы меняете коллекцию, которая повторяется? http://developer.Apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//Apple_ref/doc/uid/TP30001163-CH18-SW3

Этот пример может быть лучше.

NSArray *subviews = [[scroller subviews] copy];
for (UIView *subview in subviews) {
    [subview removeFromSuperview];
}
[subviews release];
8
Coderdad

Проблема с UIScrollView и другими подклассами UIView заключается в том, что они изначально содержат некоторые виды (например, вертикальную и горизонтальную полосу прокрутки для UIScrollView). Поэтому я создал категорию UIView, чтобы удалить отфильтрованные по классу подпредставления.

Например:

[UIScrollView removeAllSubviewsOfClass:[FooView class],[BarView class],nil];

Код:

- (void)removeAllSubviewsOfClass:(Class)firstClass, ... NS_REQUIRES_NIL_TERMINATION;


- (void)removeAllSubviewsOfClass:(Class)firstClass, ...
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"];

    va_list args;
    va_start(args, firstClass);

    for (Class class = firstClass; class != nil; class = va_arg(args, Class)) 
    {
        predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,[NSPredicate predicateWithFormat:@"self isKindOfClass:%@",class], nil]];
    }

    va_end(args);
    [[self.subviews filteredArrayUsingPredicate:predicate] makeObjectsPerformSelector:@selector(removeFromSuperview)];

}
2
Julien

Самое лучшее и простое в использовании

for(UIView *subview in [scrollView subviews])
{
  [subview removeFromSuperview];
}

Это действительно приводит к сбою, так как основное правило - массив не должен изменяться при перечислении, чтобы предотвратить его использование.

[[scrollView subviews] 
           makeObjectsPerformSelector:@selector(removeFromSuperview)];

Но иногда происходит сбой, потому что makeObjectsPerformSelector: будет перечислять и выполнять селектор. Также в iOS 7 операции с пользовательским интерфейсом оптимизированы для выполнения быстрее, чем в iOS 6, следовательно, лучший способ выполнить итерацию массива в обратном порядке и удалить

NSArray *vs=[scrollView subviews];
for(int i=vs.count-1;i>=0;i--)
{
    [((UIView*)[vs objectAtIndex:i]) removeFromSuperview];
}

Примечание: перечисление модификации вреда, но не повторение ...

1
RamaKrishna Chunduri

Самый простой и лучший способ

 for(UIView *subview in [scrollView subviews]) {

     [subview removeFromSuperview];

 }
0
Shashank Kulshrestha
for(subview) in self.scrollView.subviews {
        subview.removeFromSuperview()
}
0
johndpope