【问题标题】:Why does returning false in shouldChangeCharactersIn override old text in UITextField?为什么在 shouldChangeCharactersIn 中返回 false 会覆盖 UITextField 中的旧文本?
【发布时间】:2020-04-04 17:17:17
【问题描述】:

问题代码

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; 否则为 false 以保留旧文本。

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


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

【问题讨论】:

    标签: ios swift uitextfield copy-paste uitextfielddelegate


    【解决方案1】:

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

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

    这提供了良好的用户体验,但这种覆盖/清空不会在 shouldChangeCharactersIn 委托方法中的任何地方反映/广播。实际上,只有在文本覆盖发生后才会调用委托方法。

    没有问题,如果它不是安全的文本字段,一切都会按预期正常工作。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      相关资源
      最近更新 更多