如何将相同的功能应用于控制器中的所有文本字段而不指定每个文本字段

时间:2016-01-28 08:07:32

标签: ios swift

你好我想知道我如何能够一般性地定义可以应用于我工作的特定UITextFields中的所有UIViewController的函数。让我们说如果我有10个文本字段和我希望所有这些都被隐藏,或者选择虚假或真实。我不想写这样的文本域

textField1.hidden = true
textField2.hidden = true
textField3.hidden = true
etc etc

希望你理解我的问题

4 个答案:

答案 0 :(得分:3)

var hidden = true { didSet { view.subviews.forEach { ($0 as? UITextField)?.hidden = hidden } } }

当您更改hidden

的值时,这会隐藏/取消隐藏所有文本字段

答案 1 :(得分:1)

您可以使用这样的函数递归查找视图中的所有UITextField实例。将包含UITextField的最高级别视图或包含UITextFields的视图(因为这是递归的)作为视图参数传递;

func getTextFieldsInView(view: UIView) -> [UITextField] {
    var arrayTextFields = [UITextField]()

    for subview in view.subviews {
        arrayTextFields += getTextFieldsInView(subview)

        if let subview = subview as? UITextField {
            arrayTextFields.append(subview)
            //you can also do what you want here like: subview.hidden = true
        }
    }
    return arrayTextFields
}

这样您就不必将它们逐个添加到数组中。只需将函数调用分配给变量,即可动态创建数组。

答案 2 :(得分:0)

你可以保留所有文本字段的数组,然后通过集合保存forEach。

let textFields = [textField1, textField2, textField3, textField4]
textFields.forEach { $0.hidden = true }

答案 3 :(得分:0)

如果您的文本字段位于Interface Builder中,您可以为它们创建IBOutletCollection并作为一组对它们执行操作

// Swift
@IBOutlet var semiBoldLabels: [UITextField]!

// ObjC
@property (nonatomic, strong) IBOutletCollection(UITextField) NSArray *textFields;