当用户看到文本字段中的输入时,我想将文本字段的内容传递到checkInput
方法中。当前,如果用户删除空格会导致应该是有效的输入,则这是不起作用的。这样的操作似乎将Uitextfield内容视觉表示背后的一个输入发送到checkInput
。
extension ViewController: UITextFieldDelegate {
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var validInput = false
if let textFieldText = textField.text {
// TODO: handle removal of whitespace within text view
let input = newInput(string, in: textFieldText, at: range.location)
validInput = checkInput(newInput)
}
return !validInput
}
}
我添加了一个辅助功能,但这并不能处理所有情况(例如删除whitespace)
func newInput(_ string: String, in stringText: String?, at rangeLocation: Int) -> String {
let firstHalfString = (stringText as NSString?)?.substring(to: rangeLocation) ?? ""
let secondHalfString = (stringText as NSString?)?.substring(from: rangeLocation) ?? ""
return "(firstHalfString)(string)(secondHalfString)"
}
这里的问题是您不了解shouldChangeCharactersIn
的作用。它不是"背后的一个输入";在任何事情发生之前都被调用。这就是"应该"的意思!此方法告诉您可能发生了什么,问您应该发生什么。
那不是您想知道的。您想知道发生了什么。因此,您已经实现了错误的方法。
正确的方法是什么?uItextfield是一个uicontrol。实现其editingChanged
Action-target对以告诉您每当文本更改时,只需每次调用操作方法时直接从文本字段读取文本。