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

问题代码

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

创建TextField

@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;否则,返回true。 否则,为false保留旧文本。

为什么不保留我的旧文字?一个重要的观察结果是,在调用shouldChangeCharactersIn之前发生了文本字段覆盖。很奇怪。


PS::文本字段的文本未在shouldChangeCharactersIn方法之外的任何地方更改/分配。

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

我知道为什么会这样。原因是由于文本字段为 SecureTextEntry

iOS中密码文本字段的默认行为是,当您已经在(密码)文本字段中键入了某些内容时,如果它再次成为第一响应者(通过更早放弃其第一响应者的状态),然后开始输入/粘贴内容,现有内容将被清除。这样做是为了允许用户在上一个输入不正确的情况下输入正确的密码。

这是一个很好的用户体验,但是在 shouldChangeCharactersIn 委托方法的任何地方都不会反映/广播此覆盖/清空。实际上,仅在文本覆盖发生之后才调用委托方法。

没有问题,如果它不是安全的文本字段,那么一切都会按预期运行。

本文链接:https://www.f2er.com/2512390.html

大家都在问