2013-04-28 3 views
0

У меня есть UIView, у которого есть кнопка. Кнопки не находятся в каком-то массиве.Как найти UIButton по названию

Хотелось бы взглянуть на целое UIView (используя цикл for) и найти по его названию кнопку, а затем удалить ее.

- (void)removeButtonByTitle:(NSString*)name 
{ 
    for (buttons in view) { 
     // find the button with the name "name" and remove it from the view 
    } 
} 

Я не мог найти способ сделать это, не сохраняя свои имена/указатели в массиве.

ответ

3

Это обычно предпочтительно использовать tag свойство для этого. Затем вы можете просто найти кнопку с помощью метода viewWithTag: и не нужно настраивать код, если вы решите изменить название кнопки или локализовать свое приложение.

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

NSString *buttonTitle = @"name"; 
UIButton *buttonWithTitle = nil; 
for (UIButton *button in view.subviews) { 
    if (![button isKindOfClass:[UIButton class]]) continue; 
    if ([[button currentTitle] isEqualToString:buttonTitle]) { 
     buttonWithTitle = button; 
     break; 
    } 
} 
//do something with the button... 
+0

+1 за совет по тегу. –

+0

Большое спасибо, но тег не всегда лучше. в моем случае есть класс, который добавляет кнопки в представление, получая имя в качестве аргумента. чем позже, этот класс должен иметь метод удаления кнопки по имени, потому что имена - это пользователи, которые приходят и уходят, что я получаю с сервера. поэтому в этом случае его более удобно использовать только имена. Я ошибаюсь ? – Curnelious

+3

Я бы сказал, что оба решения не очень желательны. В идеале вы должны отслеживать свои кнопки в словаре, если вам нужно связать их с именем пользователя или что-то в этом роде. – omz

1

Ну вы могли бы сделать это следующим образом:

for (UIView *v in view.subviews) 
    if ([v isKindOfClass:[UIButton class]] && [[(UIButton *)v currentTitle] isEqualToString:@""]) 
     //remove 

Но я должен сказать, что не звучит, как надежное решение, ваше название кнопки может измениться при локализации или он может быть различным для разных состояний.

+0

, что работает, но, как дмитрий сказал, собирается по названию далеко от надежного. по крайней мере, давать уникальные теги UIButtons (когда вы их создаете в ib/code) и пытаться их использовать! –

+0

спасибо, см. Мой ответ на omz – Curnelious

1

ли что:

- (void)removeButtonByTitle:(NSString *)name 
{ 
    for (UIView *tempView in self.subviews) 
    { 
     if ([tempView isKindOfClass:[UIButton class]]) // make sure it's actually a UIButton 
     { 
       UIButton *button = tempView; 
       if ([button.titleLabel.text isEqualToString:name]) // compare the title 
       { 
        [button removeFromSuperview]; 
       } 
     } 
    } 
} 
+0

Спасибо, но у вашего кода есть ошибки. – Curnelious

0

Проверьте это:

-(void)removeButtonWithTitle:(NSString*)titleString { 
NSArray *subViews = [self.view subviews]; 
[subViews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if([obj isKindOfClass:[UIView class]]) { 
     NSArray *subViewsArray = [(UIView*)obj subviews]; 
     for (int i=0; i<[subViewsArray count]; i++) { 
      id subViewObj = [subViewsArray objectAtIndex:i]; 
      if([subViewObj isKindOfClass:[UIButton class]] && [[(UIButton*)subViewObj titleLabel].text isEqualToString:titleString]) { 
       [subViewObj removeFromSuperview]; 
       *stop = YES; 
       break; 
      } 
     } 
    } 
}]; 
} 
Смежные вопросы