textField shouldChangeCharactersInRange正在执行用户操作后面一步

时间:2015-02-21 18:37:46

标签: ios swift uikit

我有textField用户输入的电子邮件地址。我想在输入文本成为有效的电子邮件地址的瞬间激活提交按钮。

验证有效,但shouldChangeCharactersInRange中的代码似乎在用户输入后面执行了一步。因此,当电子邮件有效时,用户仍然需要在按钮更改之前再点击一个键。同样,如果电子邮件地址无效,则按钮不会更改,直到再点击一个键。

请注意,这也发生在设备上,而不仅仅是在模拟器中。

代码如下:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) {
    if emailIsValidFormat(textField.text) {
        emailSubmitButton.alpha = 1
    } else {
        emailSubmitButton.alpha = 0.4
    }
}

3 个答案:

答案 0 :(得分:2)

调用此方法时,文本尚未更改。您必须使用rangereplacementString来构建电子邮件地址,然后验证。

答案 1 :(得分:2)

将文本字段的“编辑已更改”事件连接到视图控制器中的操作可能更简单,而不是实现textField:shouldChangeCharactersInRange:replacementString:。文本字段在更新其textField:shouldChangeCharactersInRange:replacementString:属性之前发送text ,但在更新其{{1}后发送“编辑已更改”事件属性。

示例:

connect Editing Changed event

答案 2 :(得分:1)

将您的代码移到另一个地方,让我们调用它: func validateEmail(emailTextField: UITextField) -> Bool 这里重要的部分:

yourTextField.addTarget(self, action: "validateEmail:", forControlEvents: .EditingChanged).ValueChanged

每次更改字符串时都会调用

validateEmail: