ios 为什么shouldChangeCharactersIn中返回false会覆盖UITextField中的旧文本?

snz8szmq  于 2023-06-07  发布在  iOS
关注(0)|答案(1)|浏览(169)

问题代码

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方法之外的任何地方都不会更改/分配文本字段的文本。

6ie5vjzr

6ie5vjzr1#

我知道为什么会这样。原因是文本字段是**SecureTextEntry字段。
iOS中密码文本字段的默认行为是,当您已经在(密码)文本字段中键入内容时,如果它再次成为第一响应者(通过先前退出其第一响应者状态),并且您粘贴或开始键入内容,则现有内容将被清除。这恰好允许用户输入正确的密码,假设之前的输入是不正确的,因此所有内容都被删除。
这是一个很好的用户体验,但是这种覆盖/清空不会在
shouldChangeCharactersIn**delegate方法中的任何地方反映/广播。事实上,只有在文本重写发生后,才会调用委托方法。
如果不是安全文本字段,则没有问题,一切都按预期正常工作。

相关问题