shouldChangeCharactersInRange 多个文本字段被冻结

shouldChangeCharactersInRange multiple text fields gets frozen

更新了下面的代码和解决方案。

这适用于您想要的任意多个字段。

它还修复了方法 return 为 false 时文本字段冻结的问题。

下面的行是在 return 为 false 之后将方法引导至 return true 的内容。

newString = currentString.stringByReplacingCharactersInRange(range, withString: string)

在视图中加载(这将为每个字段添加一个标识符,以便您可以在方法中识别正在使用的字段 - 它是一个 Int())

    emailAddressField.tag = 1
    userPasswordField.tag = 2

关于委托方法

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    var maxLength = Int()
    var newString = NSString()
    var currentString = NSString()

    println("MY TAG \(textField.tag)")

    switch textField.tag {

    case 1:
        println("CASE 1 \(range)")

        maxLength = 16
        currentString = emailAddressField.text
       newString = currentString.stringByReplacingCharactersInRange(range, withString: string)

    case 2:
        println("CASE 2 \(range)")

        maxLength = 8
        currentString = userPasswordField.text
        newString = currentString.stringByReplacingCharactersInRange(range, withString: string)

    default:
        println("Didn't detect any field")

    }
    return newString.length <= maxLength

}

问题是委托方法 shouldChangeCharactersInRange 用于两个文本字段,在您的实现中,一旦其中一个文本字段达到其限制,您将返回 false,这最终使得两个文本字段都拒绝进一步输入。要解决此问题,您需要检查方法的 textField 参数以确定调用该方法的文本字段。

一种可能的方法是在您的两个文本字段上设置标签,例如在 viewDidLoad

override func viewDidLoad() {
    ...
    emailAddressField.tag = EMAIL_ADDRESS_TEXTFIELD // e.g. 0
    userPasswordField.tag = USER_PASSWORD_TEXTFIELD // e.g. 1
}

然后根据提供给委托方法的文本字段的标签进行操作

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newString = textField.text!.stringByReplacingCharactersInRange(range, withString: string)

    if textField.tag == EMAIL_ADDRESS_TEXTFIELD && count(newString) + 1 == 30 {
        return false
    }

    if textField.tag == USER_PASSWORD_TEXTFIELD && count(newString) + 1 == 11 {
        return false
    }

    return true
}