Iphone 在UIView中查找同一类型的所有控件

Iphone 在UIView中查找同一类型的所有控件,iphone,cocoa-touch,Iphone,Cocoa Touch,我正在寻找一种方法来自动本地化按钮/文本字段等上的文本,对于这种方法,我需要在UIView上找到所有(例如)UIButton 我尝试了以下两种方法,但它们都不起作用,就像我希望它们起作用一样: for (UIView* subView in self.view.subviews) { NSLog(@"object class : %@", [subView class]); if ([subView isMemberOfClass:[UIButton class]])

我正在寻找一种方法来自动本地化按钮/文本字段等上的文本,对于这种方法,我需要在UIView上找到所有(例如)UIButton

我尝试了以下两种方法,但它们都不起作用,就像我希望它们起作用一样:

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
}
但愚蠢的是,cocoa touch实际上只是列出for循环中的所有子视图(还有UITextFields等)


有没有办法从一个视图中获取所有UIButton?或者我真的需要通过查看控件的选择器来查找控件。

第一种方法是正确的,只是需要将isMemberOfClass函数更改为isKindOfClass:

isKindOfClass:返回布尔值 指示接收器是否为空 给定类的实例或实例 继承的任何类的实例 从那个班


当您可以通过使用块向
UIView
添加一个category方法来拨号时,为什么要编写这样的一次性代码?看看最下面的代码。对块使用此递归方法,可以执行禁用视图控制器视图中所有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
传递给我的
inseredornmentimage: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

谢谢你,这确实是我想要的方法。谢谢你的快速回答!请注意,有一种更好的方法可以使用块来实现这一点。见下面我的答案。还请注意,您的代码仅适用于子视图最顶层中的按钮。下面的整个视图层次结构呢?太棒了。我用它为我所有的UIButton添加圆角(任何人都注意到圆角按钮已从Xcode 5中删除)。好东西。