UitextfieldDelegate扩展.获取用户在uitextfield中看到的内容.Swift 4



当用户看到文本字段中的输入时,我想将文本字段的内容传递到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对以告诉您每当文本更改时,只需每次调用操作方法时直接从文本字段读取文本。

最新更新