应该如何在Swift中使用ChangeCharactersInRange?

Rya*_*yan 67 objective-c ios nsrange uitextfielddelegate swift

我正在使用shouldChangeCharactersInRange作为使用动态类型搜索的一种方式.

但是我遇到了问题,在文本字段实际更新之前调用了更改角色的内容:

在Objective C中,我使用以下方法解决了这个问题:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

但是,我试过在Swift中写这个:

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
    let txtAfterUpdate:NSString = self.projectSearchTxtFld.text as NSString
    txtAfterUpdate.stringByReplacingCharactersInRange(range, withString: string)

    self.callMyMethod(txtAfterUpdate)
    return true
}
Run Code Online (Sandbox Code Playgroud)

在得到值之前,该方法仍会被调用?

Vya*_*lav 123

斯威夫特4

此方法不使用 NSString

// MARK: - UITextFieldDelegate

extension MyViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {
        if let text = textField.text,
           let textRange = Range(range, in: text) {
           let updatedText = text.replacingCharacters(in: textRange,
                                                       with: string)
           myvalidator(text: updatedText)
        }
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

注意.使用安全文本字段时要小心.


Mik*_*ard 72

stringByReplacingCharactersInRange 返回一个新字符串,那么如何:

func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
    if let text = textField.text as NSString? {
        let txtAfterUpdate = text.replacingCharacters(in: range, with: string)
        self.callMyMethod(txtAfterUpdate)
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)

  • 很奇怪我们在使用Swift字符串时必须转换为NSString,由于参数类型不同,它不起作用. (3认同)
  • 不适用于少数语言,例如韩语。韩语单词不是仅添加最后一个字符就完成的。如果输入“대한민국”,txtAfterUpdate 将是“대한민구ㄱ”。供韩国人参考。 (2认同)

Mob*_*Dan 40

斯威夫特3和4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let textFieldText: NSString = (textField.text ?? "") as NSString
    let txtAfterUpdate = textFieldText.replacingCharacters(in: range, with: string)
    callMyMethod(txtAfterUpdate)

    return true
}

func textFieldShouldClear(_ textField: UITextField) -> Bool {
    callMyMethod("")
    return true
}
Run Code Online (Sandbox Code Playgroud)

Swift 2.2

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let textFieldText: NSString = textField.text ?? ""
    let txtAfterUpdate = textFieldText.stringByReplacingCharactersInRange(range, withString: string)
    callMyMethod(txtAfterUpdate)

    return true
}

func textFieldShouldClear(textField: UITextField) -> Bool {
    callMyMethod("")
    return true
}
Run Code Online (Sandbox Code Playgroud)

虽然该textField.text属性是可选的,但不能设置为nil.将其设置为nil将更改为空字符串UITextField.在上面的代码中,这就是为什么textFieldText设置为空字符串if if textField.text为nil(通过nil coalescing运算符??).

实现textFieldShouldClear(_:)处理文本字段的清除按钮可见和点击的情况.


And*_*eev 11

Swift 3中,它看起来像这样:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let text: NSString = (textField.text ?? "") as NSString
    let resultString = text.replacingCharacters(in: range, with: string)

    return true
}
Run Code Online (Sandbox Code Playgroud)