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

时间:2011-07-21 19:26:02

标签: 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];
    }
}

OR

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

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

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

3 个答案:

答案 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.
    }
}