我有一个 UITextField 添加了一个目标,该目标在用户键入时对字段执行检查。但是,当我的代码将文本添加到文本字段时,我目前遇到了一个问题,因为文本没有得到检查。有没有办法可以通过 .editingChanged 解决这个问题,或者是否有另一个 UIControlEvent 可以连接?
代码是:
NumberOutlet.addTarget(self, action: #selector(handleNumberImage), for: .editingChanged)
我有一个 UITextField 添加了一个目标,该目标在用户键入时对字段执行检查。但是,当我的代码将文本添加到文本字段时,我目前遇到了一个问题,因为文本没有得到检查。有没有办法可以通过 .editingChanged 解决这个问题,或者是否有另一个 UIControlEvent 可以连接?
代码是:
NumberOutlet.addTarget(self, action: #selector(handleNumberImage), for: .editingChanged)
UITextViewDelegate
您可以通过在视图控制器中实现协议来处理此问题。在您viewDidLoad
中,您希望将您的代表设置UITextField
为self
.
然后,只需实现以下方法,就像这里演示的那样:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if string.length > 1 {
// Text was pasted into the text field
// do something with pasted text
} else {
//typed string
}
return true
}
我知道的唯一方法就是在通过代码添加文本后调用您用作选择器的方法。
例如,您有一个在您按下按钮后执行的方法,并且在那里您将文本添加到您的文本字段并且 UIControlEvent 不会在这里被触发。因此,只需在按下按钮后通过此示例中的代码添加文本后调用该方法即可:
@IBAction func buttonPressed(_ sender: UIButton) {
// Note: camel case convention
numberOutlet.text?.append("added text via code")
// perform your check method
handleNumberImage()
}
您需要遵守 UITextFieldDelegate 协议。
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let isAddingCharacter: Bool = range.location >= 0 && range.length == 0
let isDeletingCharacter: Bool = range.location >= 0 && range.length == 1
var newCount: Int = textView.text.characters.count
if isAddingCharacter {
newCount += 1
} else if isDeletingCharacter {
newCount -= 1
}
// If the newCount is > 0, the user is entering text
return true
}
旁注,您的出口应命名为numberOutlet
,而不是NumberOutlet
。在 swift 中,对变量名使用驼峰式语法是惯例。