【问题标题】:How to enumerate through UITextFields on iOS如何在 iOS 上通过 UITextFields 进行枚举
【发布时间】:2011-07-21 19:26:01
【问题描述】:

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

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

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

【问题讨论】:

  • 你之前的问题here,以防有人感兴趣。
  • "你如何将它从视图“转换”为文本字段?" - UITextField 继承自 UIView,所以每个 UITextField 都是一个 UIView。您没有将其转换为 UIView,而是将其键入,告诉编译器 UIView 上的任何方法都将适用于该对象。如果您要在迭代对象时使用 UITextField 方法,请使用第二种方法,使用下面描述的更正函数,不要使用您在帖子中使用的方法:P

标签: ios uiview uitextfield fast-enumeration


【解决方案1】:

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

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

【讨论】:

  • 谢谢 - 需要查找类型转换,直到现在才听说过!
  • @Alex Coplan 欢迎你 :) 你可以开始寻找here
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这是最好的方法。

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

    所以,两者都是正确的,但只有结合起来。

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 2011-05-16
      • 2017-05-26
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多