iPhone:如何通过UITextFields枚举

简单的问题在这里:哪个是通过子视图枚举正确的方式来查找文本字段?

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]; } 

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

哪些是通过子视图来枚举文本字段的正确方法?

第一种方法是正确的。 第二种方法将迭代所有子视图,而不仅仅是types为UITextField的子视图。 for()的types只是编译器的提示。

有关更多信息,请参阅此问题 。

你如何将它从视图转换为文本字段?

这是types转换的目的。

 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 } } 

第一种方法是两者唯一的工作方法。

第二种方法会将所有子视图添加到数组中。 这就是如果你将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. } } 

这是最好的方法。

 // 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 *作为您正在执行快速枚举的types,您将使用从id到UITextField *已经(通过快速枚举)转换的值。 这并不能保证它们实际上是UITextFields ,所以你仍然需要一个运行时检查,在这种情况下是isKindOfClass:以确保你当前工作的对象实际上是一个UITextField

所以,他们都是正确的,但只有合并时。