как удалить подпредставления из прокрутки? - PullRequest
32 голосов
/ 21 августа 2009

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

У меня есть uiview и кнопка над ним в просмотре прокрутки примерно так ...

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

-(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];
}

alt text

Ответы [ 8 ]

103 голосов
/ 21 августа 2009

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

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

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

  • Поддерживайте ваши собственные массивы представлений разных типов, чтобы вы могли отправить им removeFromSuperview сообщений позже таким же образом
  • Сохраните все свои представления там, где вы их создали, и держите указатели на эти представления, чтобы вы могли отправлять их removeFromSuperview индивидуально по мере необходимости
  • Добавьте оператор if в вышеприведенный цикл, проверяя равенство классов. Например, чтобы удалить только все UIButtons (или пользовательские подклассы 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
    }
}
37 голосов
/ 26 мая 2011

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

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

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

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

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

myScrollView.subviews.forEach { $0.removeFromSuperview() }
9 голосов
/ 31 июля 2010

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

[[myScrollView viewWithTag:myButtonTag] removeFromSuperview];
8 голосов
/ 02 апреля 2011

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

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];
2 голосов
/ 22 февраля 2012

Проблема с 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)];

}
1 голос
/ 24 октября 2013

Лучше всего и проще всего использовать

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];
}

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

0 голосов
/ 09 октября 2015
for(subview) in self.scrollView.subviews {
        subview.removeFromSuperview()
}
0 голосов
/ 16 января 2013

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

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

     [subview removeFromSuperview];

 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...