我正在寻找一种自动本地化按钮/文本字段等上的文本的方法,对于此方法,我需要找到 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 循环中的所有 subview (还有 UITextFields 等)。
有没有办法真正从 View 中获取所有 UIButton?或者我真的需要通过查看选择器来找到控件吗?
最佳答案
当您可以通过使用 block 向 UIView
添加类别方法来获得令人惊叹的效果时,为什么还要编写这样的一次性代码呢?看一下最底部的代码。使用这种带有 block 的递归方法,您可以执行诸如禁用 View Controller View 中的所有 UITextField 之类的操作:
[self.view forEachUITextFieldDoBlock:^(UITextField *textField) {
textfield.enabled = NO;
}];
或者淡出 View Controller View 中的所有 UITextField:
[UIView animateWithDuration:0.25 animations:^{
[self.view forEachUITextFieldDoBlock:^(UITextField *textField) {
textField.alpha = 0.0;
}];
}
completion:^(BOOL finished){
// nothing to do for now
}];
block 非常神奇,因为您甚至可以在 block 内传递其他方法。例如,下面的代码将找到的每个 UITextField
传递给我的 inserAdornmentImage:forTextView
方法,该方法将自定义背景图像添加到每个 TextView :
[self.view forEachUITextFieldDoBlock:^(UITextField *textField) {
[self insertAdornmentImage:textFieldBGImage forTextField:textField];
}];
block 使该方法非常灵活,因此您不必每次想要使用找到的控件执行新操作时都编写专门的方法。这是魔法酱:
@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
关于iphone - 查找 UIView 中某个类型的所有控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829881/