2010-09-30 2 views
7

Я ищу способ автоматического локализации текстов на кнопках/текстовых полях и т. Д., И для этого метода мне нужно найти все (например) UIButton's на UIView.Найти все элементы управления типа в UIView

Я попытался следующие 2 методы, но они оба не работай, как я хочу, чтобы они работали:

for (UIView* subView in self.view.subviews) 
{ 
    NSLog(@"object class : %@", [subView class]); 

    if ([subView isMemberOfClass:[UIButton class]]) 
     NSLog(@"Button found!"); 
} 

Проблема с этой частью кода является то, что RoundedRectButton не соответствует классу UIButton, в то время как это действительно просто UIButton.

Я также попытался следующие:

for (UIButton* button in self.view.subviews) 
{ 
// Do my stuff 
} 

Но глупая вещь, что какао касание на самом деле просто перечисляет все подвидов в этом для цикла (также в UITextFields и т.д.).

Есть ли способ на самом деле просто получить все UIButtons с точки зрения? Или мне действительно нужно найти элементы управления, глядя на их селекторы.

+0

Просто обратите внимание, что есть намного лучший способ сделать это с помощью блоков. См. Мой ответ ниже. Также обратите внимание, что ваш код будет работать только для кнопок, которые находятся в верхнем слое subviews. Как насчет всей иерархии представлений ниже? – memmons

ответ

9

первый метод является правильным, за исключением того, что вам нужно изменить функцию isMemberOfClass к isKindOfClass:

isKindOfClass: Возвращает логическое значение , указывающее, является ли получатель экземпляр данного класса или экземпляр любого класса, который наследует от этого класса.

+0

Спасибо, это действительно тот метод, который я искал. Спасибо за быстрый ответ! –

10

Зачем писать одноразовый код, как это, когда вы можете набрать удивительность, добавив метод категории к UIView с использованием блоков? Взгляните на код в самом низу. Используя этот рекурсивный метод с блоками вы можете делать такие вещи, как отключить весь UITextFields вида в контроллере вида:

[self.view forEachUITextFieldDoBlock:^(UITextField *textField) { 
    textfield.enabled = NO; 
}]; 

Или затемнение всего UITextFields вида в контроллере вида:

[UIView animateWithDuration:0.25 animations:^{ 

    [self.view forEachUITextFieldDoBlock:^(UITextField *textField) { 
     textField.alpha = 0.0; 
    }]; 

} 
completion:^(BOOL finished){ 
    // nothing to do for now 
}]; 

Блоков довольно удивительно в что вы даже можете передавать другие методы внутри блока. Например, приведенный ниже код проходит каждый UITextField нашел на мой inserAdornmentImage:forTextView метод, который добавляет пользовательские фоновое изображение для каждого вида текста:

[self.view forEachUITextFieldDoBlock:^(UITextField *textField) { 
    [self insertAdornmentImage:textFieldBGImage forTextField:textField]; 
}]; 

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

@implementation UIView (Helper) 

- (void) forEachUITextFieldDoBlock:(void (^)(UITextField *textField))block 
{ 
    for (UIView *subview in self.subviews) 
    { 
     if ([subview isKindOfClass:[UITextField class]]) 
     { 

     block((UITextField *)subview); 

     } else { 

     [subview forEachUITextFieldDoBlock:block]; 

     } 
    } 
} 

@end 
+1

Блестящий. Я использовал это, чтобы добавить закругленные углы ко всем моим uibuttons (кто-нибудь заметил, что закругленная кнопка была удалена из Xcode 5). Хорошая вещь. –

+0

спасибо всем за отличный ответ. Даг, это хорошая идея. – Fattie

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