从委托方法调用 textField:shouldReplaceCharactersInRange

Calling textField:shouldReplaceCharactersInRange from a delegate method

我构建了一个自定义屏幕键盘,其中每个键点击 returns 一次 String?。在我的委托方法中,我想将该文本转发到 UITextFieldDelegate 方法:func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

func valueWasSent(string: String?) {
    // activeTextField is a UITextField?
    guard let textField = activeTextField else { return }

    let range = NSMakeRange(0, string!.count - 1)
    textField(activeTextField!, shouldChangeCharactersIn: range, replacementString: string!)
}

此处最后一行无效,并抛出错误:

Cannot call value of non-function type 'UITextField'

知道如何实现吗?谢谢

您很可能不应该自己调用该委托方法。 shouldChangeCharactersIn 只是检查编辑是否有效。通常,UITextField 调用它以确保提议的更改有效或无效。如果不是,则忽略更改。如果是,则更新文本字段的文本。

如果你真的想调用它,那么你需要在委托上调用它,而不是 self。您需要检查 return 值。如果它 returns true 那么你应该相应地更新文本字段的文本。

if textField.delegate?.textField(textField, shouldChangeCharactersIn: range, replacementString: string!) {
    // update the text field's text
}

另请注意,您传递给它的范围应反映文本字段中的当前选择。您正在将其设置为匹配 string 的长度。那很糟。如果您希望 string 完全替换当前值,至少传入一个与文本字段的当前值匹配的范围,而不是 string.