Ios 调用textField:shouldReplaceCharactersRange来自委托方法

Ios 调用textField:shouldReplaceCharactersRange来自委托方法,ios,swift,uitextfield,uikit,Ios,Swift,Uitextfield,Uikit,我已经建立了一个定制的屏幕键盘,每个按键都返回一个字符串?。在我的委托方法中,我想将该文本转发到UITextFieldDelegate方法:func textField(\utextfield:UITextField,shouldchangeCharactersinrange:NSRange,replacementString:string)->Bool func valueWasSent(string: String?) { // activeTextField is a UIText

我已经建立了一个定制的屏幕键盘,每个按键都返回一个
字符串?
。在我的委托方法中,我想将该文本转发到
UITextFieldDelegate
方法:
func textField(\utextfield:UITextField,shouldchangeCharactersinrange:NSRange,replacementString: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!)
}
此处的最后一行无效,并引发错误:

无法调用非函数类型“UITextField”的值


你知道我怎样才能做到这一点吗?谢谢

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

如果您确实想调用它,那么您需要在代理上调用它,而不是
self
。您需要检查返回值。如果返回
true
,则应相应地更新文本字段的文本

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

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

的范围,您可以进一步解释一下:“如果您确实想调用它,那么您需要在代理上调用它,而不是在self上。”理想情况下,自定义键盘委托方法允许
shouldChangeCharactersInRange
做出编辑决定。但我不知道该怎么做谢谢!现在有没有一种方法可以在我不显式设置textField.text的情况下更新textField的文本?例如,如果您使用的是硬件键盘,则值在
shouldChangeCharactersIn
返回trueLook后更新,查看
uiteInput
UIKeyInput
协议(其中
UITextField
符合)的方法。