如何通过iOS上的UITextFields进行枚举

如何通过iOS上的UITextFields进行枚举,ios,uiview,uitextfield,fast-enumeration,Ios,Uiview,Uitextfield,Fast Enumeration,通过子视图枚举以查找文本字段的正确方法是什么 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 (UIView *view in [self.view subviews]) {
    if ([view isKindOfClass:[UITextField class]]) {            
        [mutableTFs addObject: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*
指定为执行快速枚举的类型,您将使用已经(通过快速枚举)从id转换为
UITextField*
的值这并不保证它们实际上是UITextField,因此您仍然需要进行运行时检查,在本例中,
是类:
,以确保您当前使用的对象确实是一个
UITextField


因此,这两种方法都是正确的,但只有在结合使用时才正确。

第一种方法是这两种方法中唯一的工作方法

第二种方法是将所有子视图添加到数组中。也就是说,如果要将
子视图
更改为
子视图

您可以执行以下操作:

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.
    }
}
通过子视图枚举以查找文本的正确方法是什么 田地

第一种方法是正确的。第二种方法将迭代所有子视图,而不仅仅是类型为
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
    }
}

如果有人感兴趣,请回答前面的问题。“如何将其从视图“转换”为文本字段?”-UITextField继承自UIView,因此每个UITextField都是UIView。您没有将其转换为UIView,而是键入casted,告诉编译器UIView上的任何方法都可以处理此对象。如果在迭代对象时使用UITextField方法,使用下面描述的正确函数,则需要第二种方法,不要使用帖子中的方法:PThanks-需要查看类型转换,直到现在才听说过@亚历克斯·科普兰:不客气:)你可以开始找了。
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
    }
}