使用`textField:shouldChangeCharactersInRange:`,如何获取包含当前键入字符的文本?

use*_*961 111 objective-c uitextfield ios

我正在使用下面的代码尝试textField2textField1用户输入时更新文本内容以匹配textField1.

- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {    
  if (theTextField == textField1){    
     [textField2 setText:[textField1 text]];    
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,我观察到的输出是......

当textField1为"123"时,textField2为"12"

当textField1为"1234"时,textField2为"123"

......当我想要的是:

当textField1为"123"时,textField2为"123"

当textField1为"1234"时,textField2为"1234"

我究竟做错了什么?

Vla*_*mir 269

-shouldChangeCharactersInRange文本字段实际更改其文本之前调用,这就是您获取旧文本值的原因.要在更新后使用以获取文本:

[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
Run Code Online (Sandbox Code Playgroud)

  • 这*几乎*对我有用.如果我输入了一个字符,这就有用了.如果我按下删除按钮,它将删除两个字符.对我来说,以下建议有效:http://stackoverflow.com/questions/388237/getting-the-value-of-a-uitextfield-as-keystrokes-are-entered基本上,从UITextField拖放到UITextField你的代码(创建一个函数),然后右键单击你的TextField,然后从圆圈拖动"编辑已更改"到你的新功能.(叹息.我有时想念Visual Studio ..) (14认同)
  • 或者在Swift中使用textFiel.text =(textFiel.text as NSString).stringByReplacingCharactersInRange(range,withString:string) (5认同)

btm*_*dan 51

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

    NSLog(@"%@",searchStr);
    return YES;
}
Run Code Online (Sandbox Code Playgroud)


foc*_*ner 36

斯威夫特3

根据接受的答案,以下内容适用于Swift 3:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)

    return true
}
Run Code Online (Sandbox Code Playgroud)

注意

双方StringNSString有方法叫replacingCharacters:inRange:withString.但是,正如预期的那样,前者需要一个实例Range,而后者需要一个实例NSRange.的textField委托方法使用一个NSRange实例,因此,使用NSString在这种情况下.


tom*_*ute 24

而不是使用UITextFieldDelegate,尝试使用UITextField的"编辑已更改"事件.


bau*_*sic 12

在Swift(4)中,没有NSString(纯粹的Swift):

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if let textFieldString = textField.text, let swtRange = Range(range, in: textFieldString) {

        let fullString = textFieldString.replacingCharacters(in: swtRange, with: string)

        print("FullString: \(fullString)")
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)


ioo*_*opl 8

Swift版本:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    if string == " " {
        return false
    }

    let userEnteredString = textField.text

    var newString = (userEnteredString! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString

    print(newString)

    return true
}
Run Code Online (Sandbox Code Playgroud)


Dee*_*olu 5

这是你需要的代码,

if ([textField isEqual:self.textField1])
  textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];
Run Code Online (Sandbox Code Playgroud)