我有一个UITextField,它添加了一个目标,在用户输入时对该字段执行检查。我目前有一个问题,但是当我的代码在文本字段中添加文本时,文本没有被检查。有没有办法可以通过.editingChanged解决这个问题,还是有另一个UIControlEvent可以挂钩?
代码是:
NumberOutlet.addTarget(self, action: #selector(handleNumberImage), for: .editingChanged)
答案 0 :(得分:1)
您可以通过在viewcontroller中实现UITextViewDelegate
协议来实现此目的。在viewDidLoad
中,您需要将UITextField
的代理设置为self
。
然后,只需实现以下方法,如演示here:
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
}
答案 1 :(得分:0)
您需要符合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中使用驼峰案例语法来表示变量名。
答案 2 :(得分:0)
我知道的唯一方法就是在通过代码添加文本后调用您用作选择器的方法。
例如,您有一个按下按钮后执行的方法,并且您在文本字段中添加了文本,并且此处不会触发UIControlEvent。因此,在按下按钮后,只需在此示例中通过代码添加文本后调用该方法:
@IBAction func buttonPressed(_ sender: UIButton) {
// Note: camel case convention
numberOutlet.text?.append("added text via code")
// perform your check method
handleNumberImage()
}