2010-09-30 78 views
7

我正在尋找一種方法來自動本地化按鈕/文本字段等文本和這種方法我需要找到UIBiew上的所有(例如)UIButton。在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 
} 

但愚蠢的事情是,是可可觸摸實際上只是列出了在for循環(也UITextFields等)的所有子視圖。

有沒有辦法從視圖中實際獲取所有UIButtons?或者我真的需要通過查看它們的選擇器來找到控制。

+0

只是說明有一個更好的方法來使用塊做到這一點。請參閱下面的答案。還要注意,你的代碼只適用於最頂層的子視圖中的按鈕。那下面的整個視圖層次呢? – memmons 2013-03-08 16:37:09

回答

9

第一種方法是正確的,除非你需要改變isMemberOfClass功能isKindOfClass

isKindOfClass:返回一個布爾值 指示接收者是否 定類的實例或從該類繼承 的任何類的一個 實例。

+0

謝謝,這確實是我正在尋找的方法。感謝您的快速回答! – 2010-09-30 11:04:08

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

輝煌。我用它爲我所有的uibutton添加了圓角(任何人都會注意到從Xcode 5中刪除了圓角按鈕)。好東西。 – 2013-11-13 05:09:41

+0

感謝大家的好評。 Dawg,這是個好主意。 – Fattie 2014-07-08 16:48:53

相關問題