iOS -Textfield的shouldChangeCharactersIn范围禁用.editingChanged的target方法

时间:2019-02-28 13:18:11

标签: ios swift uitextfield

我有一个textField可以通过设置.autocapitalizationType = .none来禁用大写字母,并且在shouldChangeCharactersIn range中,我用小写字母替换所有大写字母 由using this answer

仅强制使用小写字母可以正常工作,但是我添加到.editingChanged的目标方法停止了工作。

.editingChanged为什么停止工作?

let emailTextField: UITextField = {
    let textField = UITextField()
    return textField
}()

let userNameTextField: UITextField = {
    let textField = UITextField()
    textField.autocapitalizationType = .none
    textField.addTarget(self, action: #selector(printSomething), for: .editingChanged)
    return textField
}()

@objc func printSomething() {
    // as I type inside the usernameTextField this no longer prints
    print("something")
}

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

    // only change characters for username textfield
    if textField == userNameTextField {

        userNameTextField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.lowercased())
        return false
    }
    return true
}

2 个答案:

答案 0 :(得分:1)

更改以返回true

   if textField == userNameTextField {

        userNameTextField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.lowercased())
        return true
    }

答案 1 :(得分:0)

问题是您的userNameTextField声明。初始化时没有self。您需要将其声明更改为lazy

lazy var userNameTextField: UITextField = {
    let textField = UITextField()
    textField.autocapitalizationType = .none
    textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
    return textField
}()

我还将删除rangeChangedCharacters,并在editChanged方法中进行所有字符操作:

@objc func editingChanged(_ textField: UITextField) {
    print(textField.text!)
    textField.text = textField.text!.lowercased()
}