3

枚举子视图以查找文本字段的正确方法是什么?

NSMutableArray *mutableTFs = [[NSMutableArray alloc] init];

for (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {            
        [mutableTFs addObject:view];
    }
}

或者

NSMutableArray *mutableTFs = [[NSMutableArray alloc] init];

for (UITextField *textField in [self.view subviews]) {
    [mutableTFs addObject:textField];
}

我知道这不是正确的措辞,但我不明白的是,如果它是顶级方法,你如何将它从视图“转换”为文本字段?

4

3 回答 3

10

枚举子视图以查找文本字段的正确方法是什么?

第一种方法是正确的。第二种方法将遍历所有子视图,而不仅仅是 type 的子视图UITextField。中的类型for()只是对编译器的提示。

有关详细信息,请参阅此问题

您如何将其从视图“转换”为文本字段?

这就是类型转换的用途。

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
    }
}
于 2011-07-21T19:47:13.933 回答
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:,以确保您当前正在工作的对象确实是UITextField.

所以,它们都是正确的,但只有在结合时才正确。

于 2011-07-21T19:46:49.833 回答
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.
    }
}
于 2011-07-21T19:46:51.410 回答