Swift 4 -只标识一个文本字段作为editingDidEnd等的委托

bttbmeg0  于 2023-09-30  发布在  Swift
关注(0)|答案(6)|浏览(101)

我一直保持这个问题没有具体的背景,因为我相信它会对其他人有帮助:
我有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/,我发现它很有用,但我被这个错误卡住了。

yeotifhr

yeotifhr1#

UITextField delegate方法允许您识别开始编辑的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
    }
}
rekjcdws

rekjcdws2#

这就是为什么委托函数textFieldDidBeginEditing有一个textField参数。重命名它没有任何作用。
如果你想辨别你的文本字段,比较textField参数和你的IBOutlet s,如下所示:

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

}
dy1byipe

dy1byipe3#

简单地设置两个textField的tag为0和1,然后在delegate方法中检查textField的tag。

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

fd3cxomn4#

让我们先分析一下你的代码,看看哪里出了问题:

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")
    }
}
yfwxisqw

yfwxisqw5#

您已经命名了接收UITextField引用的参数,该引用 * 传递给委托方法 * textField1;该参数的名称与属性的名称无关。您可以将其命名为textField,尽管没有名为textField的属性,代码仍然可以编译。
您需要比较传递给delegate方法的UITextField示例:

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

vfhzx4xs6#

你可以做这两种方式要么你可以把if条件textfield就像保罗说,或者如果你不想textfield2与任何textfield委托工作,你可以删除行

textField2.delegate = self

相关问题