iOS -Textfield 的 shouldChangeCharactersIn 范围正在禁用 .editingChanged 的目标方法
iOS -Textfield's shouldChangeCharactersIn range is disabling .editingChanged's target method
我有一个文本字段,我通过设置 .autocapitalizationType = .none
禁用大写字母,在 shouldChangeCharactersIn range
中我用小写字母替换所有大写字母
通过 .
强制只使用小写字母可以正常工作,但我添加到 .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
}
问题出在您的 userNameTextField 声明上。当你初始化它时,没有 self
。您需要将其声明更改为 lazy
:
lazy var userNameTextField: UITextField = {
let textField = UITextField()
textField.autocapitalizationType = .none
textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
return textField
}()
我还会删除范围内的 shouldChangeCharacters 并在 editingChanged 方法中进行所有字符操作:
@objc func editingChanged(_ textField: UITextField) {
print(textField.text!)
textField.text = textField.text!.lowercased()
}
更改为 return true
if textField == userNameTextField {
userNameTextField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.lowercased())
return true
}
我有一个文本字段,我通过设置 .autocapitalizationType = .none
禁用大写字母,在 shouldChangeCharactersIn range
中我用小写字母替换所有大写字母
通过
强制只使用小写字母可以正常工作,但我添加到 .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
}
问题出在您的 userNameTextField 声明上。当你初始化它时,没有 self
。您需要将其声明更改为 lazy
:
lazy var userNameTextField: UITextField = {
let textField = UITextField()
textField.autocapitalizationType = .none
textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged)
return textField
}()
我还会删除范围内的 shouldChangeCharacters 并在 editingChanged 方法中进行所有字符操作:
@objc func editingChanged(_ textField: UITextField) {
print(textField.text!)
textField.text = textField.text!.lowercased()
}
更改为 return true
if textField == userNameTextField {
userNameTextField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.lowercased())
return true
}