我保留这个问题没有具体的背景,因为我确信这对其他人有帮助:
我有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/,我发现它很有用,但我坚持这个错误。
答案 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