2010-09-30 76 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

相关问题