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

Wim*_*tra 7 iphone cocoa-touch

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

我尝试了以下两种方法,但它们都没有像我希望它们一样工作:

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

    if ([subView isMemberOfClass:[UIButton class]])
        NSLog(@"Button found!");
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题是RoundedRectButton与UIButton类不匹配,而它实际上只是一个UIButton.

我也尝试过以下方法:

for (UIButton* button in self.view.subviews)
{
// Do my stuff
}
Run Code Online (Sandbox Code Playgroud)

但愚蠢的是,可可触摸实际上只列出了for循环中的所有子视图(也是UITextFields等).

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

mem*_*ons 10

为什么要通过添加类别方法来UIView使用块来拨打真棒来编写这样的一次性代码?看看底部的代码.使用这个带块的递归方法,你可以在视图控制器的视图中禁用所有UITextFields:

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

或者在视图控制器的视图中淡出所有UITextField:

[UIView animateWithDuration:0.25 animations:^{

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

}
completion:^(BOOL finished){
   // nothing to do for now
}];
Run Code Online (Sandbox Code Playgroud)

块非常惊人,甚至可以在块内传递其他方法.例如,下面的代码将每个UITextField找到的代码传递给我的inserAdornmentImage:forTextView方法,该方法为每个文本视图添加自定义背景图像:

[self.view forEachUITextFieldDoBlock:^(UITextField *textField) {
    [self insertAdornmentImage:textFieldBGImage forTextField:textField];
}];
Run Code Online (Sandbox Code Playgroud)

块使得该方法非常灵活,因此您不必在每次使用所找到的控件执行新操作时编写专门的方法.这是神奇的酱汁:

@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
Run Code Online (Sandbox Code Playgroud)


Vla*_*mir 9

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

isKindOfClass:返回一个布尔值,指示接收者是给定类的实例还是从该类继承的任何类的实例.