为什么在 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
委托方法中的任何地方。事实上,只有在文本覆盖发生后才会调用委托方法。
没有问题,如果它不是安全的文本字段,一切正常。
问题代码
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
委托方法中的任何地方。事实上,只有在文本覆盖发生后才会调用委托方法。
没有问题,如果它不是安全的文本字段,一切正常。