问题代码
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return false
}
文本字段创建
@discardableResult fileprivate func otpTextField() -> BJOTPTextField {
let textField = BJOTPTextField()
textField.text = "1"
textField.delegate = self
textField.textColor = .black
textField.textAlignment = .center
textField.isSecureTextEntry = true
textField.keyboardType = .numberPad
return textField
}
提问
我在视图控制器中有一个UITextField
子类,在初始化时它有文本(“1”)。我将一个大文本复制粘贴到文本域上。在shouldChangeCharactersIn
方法中,即使我显式返回false
,文本字段中的当前文本(“1”)也会被删除,并变为空,为什么?
shouldChangeCharactersIn
文档
如果指定的文本范围应被替换,则返回true;否则,为false以保留旧文本。
为什么我的旧文本没有被维护?一个重要的观察结果是,文本字段覆盖发生在调用shouldChangeCharactersIn
之前。很奇怪
**PS:**在shouldChangeCharactersIn
方法之外的任何地方都不会更改/分配文本字段的文本。
1条答案
按热度按时间6ie5vjzr1#
我知道为什么会这样。原因是文本字段是**
SecureTextEntry
字段。iOS中密码文本字段的默认行为是,当您已经在(密码)文本字段中键入内容时,如果它再次成为第一响应者(通过先前退出其第一响应者状态),并且您粘贴或开始键入内容,则现有内容将被清除。这恰好允许用户输入正确的密码,假设之前的输入是不正确的,因此所有内容都被删除。
这是一个很好的用户体验,但是这种覆盖/清空不会在
shouldChangeCharactersIn
**delegate方法中的任何地方反映/广播。事实上,只有在文本重写发生后,才会调用委托方法。如果不是安全文本字段,则没有问题,一切都按预期正常工作。