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

Why does returning false in shouldChangeCharactersIn override old text in UITextField?

问题代码

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 方法中,即使我 return 显式 false,文本字段中的当前文本(“1”)也被删除并变为空,为什么?

shouldChangeCharactersIn 文档

Returns true if the specified text range should be replaced; otherwise, false to keep the old text.

为什么我的旧文本没有得到维护?一个重要的观察是文本字段覆盖发生在 shouldChangeCharactersIn 被调用之前。很奇怪。


PS: 文本字段的文本不在 altered/assigned shouldChangeCharactersIn 方法之外的任何地方。

我明白为什么会这样了。原因是由于文本字段是 SecureTextEntry 一个。

密码文本字段在 iOS 中的默认行为是,当您已经在(密码)文本字段中输入内容时,如果它再次成为第一响应者(通过提前退出其第一响应者状态) , 然后您粘贴或开始输入内容,现有内容将被清除。这恰好允许用户在假设先前输入不正确的情况下输入正确的密码。

这是一个很好的用户体验,但是 overriding/emptying 不是 reflected/broadcast shouldChangeCharactersIn 委托方法中的任何地方。事实上,只有在文本覆盖发生后才会调用委托方法。

没有问题,如果它不是安全的文本字段,一切正常。