Swift 4 - 仅将一个文本字段标识为editDidEnd等的委托

时间:2018-05-22 10:45:16

标签: ios swift swift4

我保留这个问题没有具体的背景,因为我确信这对其他人有帮助:

我有2个IB插座文本字段:

@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!

我希望能够禁用页面上的按钮,直到两个按钮都已正确填写,以便我在ViewDidLoad()中使用以下代理(我已将TextFieldDelegate添加到我的VC中。)

override func viewDidLoad() {
    textField1.delegate = self
    textField2.delegate = self
}

然后,我将使用一些函数来执行表单验证并采取特定操作,但为了保持简单,我们只需将其打印到控制台即可。

我想要做的只是检查textField1中的验证而不是textField2中的验证。即所需的输出是当用户开始编辑textField1时打印,但如果用户编辑textField2则不会打印任何内容。

我目前正在使用:

func textFieldDidBeginEditing(_ textField1: UITextField) {
    print("TextField did begin editing method called")
}

但是在编辑textField时就是打印。

我以为我已经指定了_ textField1,所以不确定为什么两者都会触发它?

对于Swift 3及更早版本,有一些解决类似问题的答案。特别是一个答案引用了这个链接http://sourcefreeze.com/uitextfield-and-uitextfield-delegate-in-swift/,我发现它很有用,但我坚持这个错误。

6 个答案:

答案 0 :(得分:6)

UITextField委托方法可让您确定哪个textField正在开始编辑,因此您只需要检查它是否是您的第一个textField或不是这样。

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField == self.textField1 {
        print("TextField did begin editing method called")
        // Do your Validate for first text field
    } else {
        //Do Nothing
    }
}

答案 1 :(得分:2)

这就是委托函数textFieldDidBeginEditing具有textField参数的原因。重命名它什么都不做。

如果您想要识别文本字段,请将textField参数与IBOutlet进行比较,如下所示:

func textFieldDidBeginEditing(_ text Field: UITextField) {
    if textField == textField1 {
        // Validate first text field
    } else if textField == textField2 {
        // Validate second text field
    }

}

答案 2 :(得分:2)

您已命名参数,该参数接收传递给委托方法的UITextField引用 textField1;此参数的名称与您的属性名称无关。您可以调用它textField,尽管没有名为textField的属性,您的代码仍会编译。

您需要比较传递给委托方法的UITextField实例:

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField === self.textField1 {  
        print("TextField did begin editing method called for text field 1")
    }
}

答案 3 :(得分:2)

只需将textFields的标记设置为0和1,然后在委托方法中检查文本字段的标记。

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField.tag == 0 {  
        print("TextField did begin editing method called for text field 1")
    }
}

答案 4 :(得分:2)

让我们首先分析您的代码,看看有什么问题:

func textFieldDidBeginEditing(_ textField1: UITextField) {
    print("TextField did begin editing method called")
}

您已将textField重命名为textField1。但是,命名应该负责此操作的UI元素。相反,这是一个function parameter,它允许您从函数中访问有关调用操作的对象的信息,而不管外部范围如何。相反,您应该使用=== operator,它检查两个引用是否指向同一个对象实例。所以你的代码应该成为:

func textFieldDidBeginEditing(_ textField: UITextField) {
    if textField === self.textField1 {
        print("TextField 1 did begin editing method called")
    }
}

答案 5 :(得分:1)

你可以做两种方式,你可以将if条件放在textfield上,就像paul所说的那样,或者如果你不想让textfield2与任何一个文本字段委托一起工作,你可以删除该行

  textField2.delegate = self