2010-02-03 2 views
5

Я программно добавляю пару UIButtons к моему представлению. После нажатия одной из кнопок все они должны быть «removeFromSuperView» или выпущены, а не только один.удалить все UIButton's from subview

for (int p=0; p<[array count]; p++) { 
    button = [[UIButton alloc] initWithFrame:CGRectMake(100,100,44,44)]; 
    button.tag = p; 
    [button setBackgroundImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];  
    [self.view addSubview:button];  
    [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside]; 
} 

Теперь это та часть, где все кнопки должны быть удалены. Не один.

-(void) action:(id)sender{ 
    UIButton *button = (UIButton *)sender; 
    int pressed = button.tag; 
    [button removeFromSuperview]; 
} 

Я надеюсь, что кто-то может помочь мне с этим!

ответ

2
NSMutableArray *buttonsToRemove = [NSMutableArray array]; 
for (UIView *subview in self.view.subviews) { 
    if ([subview isKindOfClass:[UIButton class]]) { 
     [buttonsToRemove addObject:subview]; 
    } 
} 
[buttonsToRemove makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

EDIT:
Я отредактировал мой ответ на лучшее решение.
Теперь объекты не удаляются из массива при перечислении его ...

+0

следует читать "для (UIView * подвид в self.view.subviews)" Я думаю, – FelixLam

+0

Thnx Micheal! После изменения (UIView * subview in self.view) в: (UIView * subview в [self.view subviews]) он работает как шарм! – Martijn

+0

@ Феликс, спасибо за исправление. Вы абсолютно правы. Я отредактировал свой ответ. –

8

Более эффективным способом было бы добавить каждую кнопку в массив при ее создании, а затем, когда нажата кнопка, кнопки в массиве вызова метода -removeFromSuperView так:

[arrayOfButtons makeObjectsPerformSelector:@selector(removeFromSuperView)]; 

Тогда после этого, вы можете либо сохранить кнопки в массиве и повторно использовать их, или позвоните removeAllObjects, чтобы освободить их. Затем вы можете начать заполнять его позже.

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

+0

Хорошее решение ... –

+0

действительно чистая идея. я сделал это всегда, с дополнительным представлением, а затем выполнил этот «makeObjectsPerformSelector:» в этом представлении. но делать это с помощью массива намного лучше. – choise

8

Другой ответ только для справки:

for (int i = [self.view.subviews count] -1; i>=0; i--) { 
    if ([[self.view.subviews objectAtIndex:i] isKindOfClass:[UIButton class]]) { 
     [[self.view.subviews objectAtIndex:i] removeFromSuperview]; 
    } 
} 
2

Кроме того, попробуйте это все очень просто:

for (UIButton *btn in self.view.subviews){  
       [btn removeFromSuperview]; //remove buttons 
    } 
+0

, как сказал St3fan, при использовании быстрого перечисления вам НЕ ДОЛЖНО изменять содержимое коллекции. – Daniel

 Смежные вопросы

  • Нет связанных вопросов^_^