我一直保持这个问题没有具体的背景,因为我相信它会对其他人有帮助:
我有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条答案
按热度按时间yeotifhr1#
UITextField
delegate方法允许您识别开始编辑的textField
,因此您只需检查它是否是您的第一个textField
。rekjcdws2#
这就是为什么委托函数
textFieldDidBeginEditing
有一个textField
参数。重命名它没有任何作用。如果你想辨别你的文本字段,比较
textField
参数和你的IBOutlet
s,如下所示:dy1byipe3#
简单地设置两个textField的tag为0和1,然后在delegate方法中检查textField的tag。
fd3cxomn4#
让我们先分析一下你的代码,看看哪里出了问题:
将
textField
重命名为textField1
。但是,这并没有命名应该负责此操作的UI元素。相反,这是一个function parameter,它允许你从你的函数中访问调用动作的对象的信息,而不管外部作用域是什么。相反,您应该使用===
operator,它检查两个引用是否指向同一个对象示例。所以你的代码应该变成:yfwxisqw5#
您已经命名了接收
UITextField
引用的参数,该引用 * 传递给委托方法 *textField1
;该参数的名称与属性的名称无关。您可以将其命名为textField
,尽管没有名为textField
的属性,代码仍然可以编译。您需要比较传递给delegate方法的
UITextField
示例:vfhzx4xs6#
你可以做这两种方式要么你可以把
if
条件textfield
就像保罗说,或者如果你不想textfield2与任何textfield委托工作,你可以删除行