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

时间:2010-02-04 07:44:35

标签: ios objective-c uitextfield

我正在使用以下代码尝试让textField2的文字内容在用户输入textField1时更新为与textField1匹配。

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

然而,我观察到的输出是......

  当textField1为“123”

时,

textField2为“12”      当textField1为“1234”

时,

textField2为“123”

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

  当textField1为“123”

时,

textField2为“123”      当textField1为“1234”

时,

textField2为“1234”

我做错了什么?

10 个答案:

答案 0 :(得分:267)

在文本字段实际更改其文本之前,

-shouldChangeCharactersInRange被称为,这就是您获取旧文本值的原因。要在更新后使用文本:

[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];

答案 1 :(得分:51)

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

    NSLog(@"%@",searchStr);
    return YES;
}

答案 2 :(得分:34)

Swift 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
}

注意

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

答案 3 :(得分:23)

不要使用UITextFieldDelegate,而是尝试使用UITextField的"Editing Changed"事件。

答案 4 :(得分:10)

在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
}

答案 5 :(得分:7)

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
}

答案 6 :(得分:5)

这是您需要的代码,

if ([textField isEqual:self.textField1])
  textField2.text = [textField1.text stringByReplacingCharactersInRange:range withString:string];

答案 7 :(得分:1)

使用警卫

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        guard case let textFieldString as NSString = textField.text where
            textFieldString.stringByReplacingCharactersInRange(range, withString: string).length <= maxLength else {
                return false
        }
        return true
    }

答案 8 :(得分:0)

我的解决方案是使用UITextFieldTextDidChangeNotification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];

不要忘记在[[NSNotificationCenter defaultCenter] removeObserver:self];方法中致电dealloc

答案 9 :(得分:0)

如果您需要用此替换文本字段文本,您可以使用我的解决方案(Swift 3):https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047

替换后,您只需textField.text即可检索撰写文本。