通过子视图枚举查找文本字段的正确方法是什么?
NSMutableArray *mutableTFs = [[NSMutableArray alloc] init];
for (UIView *view in [self.view subviews]) {
if ([view isKindOfClass:[UITextField class]]) {
[mutableTFs addObject:view];
}
}
OR
NSMutableArray *mutableTFs = [[NSMutableArray alloc] init];
for (UITextField *textField in [self.view subviews]) {
[mutableTFs addObject:textField];
}
我知道这不是正确的措辞,但我不明白的是,如果它是顶级方法,你如何将它从视图转换为文本字段?
答案 0 :(得分:10)
通过子视图枚举来查找文本的正确方法是什么 字段?
第一种方法是正确的方法。第二种方法将迭代所有子视图,而不仅仅是类型为UITextField
的子视图。 for()
中的类型只是编译器的提示。
有关详细信息,请参阅this question。
如何将它从视图转换为文本字段?
这就是类型转换的目的。
for (UIView *view in [self.view subviews]) {
if ([view isKindOfClass:[UITextField class]]) {
// you don't need to cast just to add to the array
[mutableTFs addObject:view];
// typecasting works as it does in C
UITextField *textField = (UITextField *)view;
// do something with textField
}
}
答案 1 :(得分:0)
这是最好的方式。
// Make sure you're releasing this!
NSMutableArray *textFields = [[NSMutableArray alloc] init];
for (UITextField *textField in [self.view subviews]) {
if ([textField isKindOfClass:[UITextField class]]) {
[textFields addObject:textField];
}
}
通过将UITextField *
指定为您正在执行快速枚举的类型,您将使用已经(通过快速枚举)从id转换为UITextField *
的值。 这并不能保证它们实际上是UITextFields ,因此您仍然需要运行时检查(在本例中为isKindOfClass:
),以确保您当前正在使用的对象实际上是{{ 1}}。
所以,他们两个都是正确的,但只有在合并时。
答案 2 :(得分:0)
第一种方法是两者的唯一工作方法。
第二种方法是将所有子视图添加到数组中。也就是说,如果您将subViews
更改为subviews
。
您可以执行以下操作:
for (UITextField *textField in [self.view subviews]) {
if ([textField isKindOfClass:[UITextField class]]) {
[mutableTFs addObject:textField];
}
}
这样您就不必将视图转换为文本字段来执行特定于文本字段的操作,而不是仅将其添加到数组中。
编辑:如果您不想立即转换为文本字段,可能是因为您正在查找文本字段和文本视图。这是你以后转换的方式:
for (UIView *view in [self.view subviews]) {
if ([view isKindOfClass:[UITextField class]]) {
UITextField *textField = (UITextField *)view;
// Do whatever you want with the text field.
}
if ([view isKindOfClass:[UITextView class]]) {
UITextView *textView = (UITextView *)view;
// Do whatever you want with the text view.
}
}