Iphone 如何为UITextField获取textDidChange(如UISearchBar)方法?

Iphone 如何为UITextField获取textDidChange(如UISearchBar)方法?,iphone,uitextfield,Iphone,Uitextfield,如何为UITextField获取textDidChange方法?每次对文本字段进行更改时,我都需要调用一个方法。这可能吗? 谢谢 您可以使用UITextFieldTextDidChangeNotification在文本字段更改时调用方法。将此添加到您的init: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChang

如何为UITextField获取textDidChange方法?每次对文本字段进行更改时,我都需要调用一个方法。这可能吗?
谢谢

您可以使用
UITextFieldTextDidChangeNotification
在文本字段更改时调用方法。将此添加到您的
init

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

您可以设置代理并使用

- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string;

在进一步阐述Ben Gottlieb的上述答案时,使用textField shouldChangeCharactersInRange非常好,但也有一个缺点,即某些事情可能会在单字符延迟的情况下发生

例如,当您输入一个字符且该字符不再为空时,在没有文本的情况下调用下面的命令来提醒您实际上被称为后面的字符

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    if (!textField.text.length) {
        // Do something with empty textfield
    }
    return YES;
 }
下面的方法允许您在文本字段中进行基本更改。虽然不像NSNotification那样直接,但它仍然允许您对不同的文本字段使用类似的方法,因此在尝试获取文本字段中的特定字符更改时,这是一件非常有用的事情

下面的代码修复了字符延迟

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    // This means it updates the name immediately
    NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    textField.placeholder = newString.length ? @"" : @"Name";

    return YES;
 } 

例如,当文本字段中没有文本时,此代码用于向UITextField添加占位符

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
    return true
}

您还可以为
UIControlEventEditingChanged
事件设置目标和选择器。例如:

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]

请注意,这只会在用户对文本字段进行初始更改时调用,而在以编程方式设置文本时不会自动调用。

在委托shouldChangeCharactersRange中使用
replaceCharactersRange
时,我发现一些问题

例如:在越南语键盘字符串
aa
->
中–如果使用方法
replaceCharactersRange
,则结果不正确

在这种情况下,您可以通过事件
UIControlEventEditingChanged
进行尝试:

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]

下面是我使用的Swift 4

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

    guard let fieldText = textField.text else {
        return false
    }
    // Append the existing textfield text with the new character
    var text = fieldText + string
    // If it is the very first character, textfield text will be empty so take the 'string' and on delete also textfield text get deleted with a delay
    if range.location == 0{
       text = string
    }
    return true
}

谢谢这很有效。我必须执行以下操作才能获得完整字符串:NSMutableString*textFieldString=[NSMutableString-stringWithString:textField.text];[textFieldString appendString:string];为了所有像我这样的人。这是一个委托方法,可以按原样插入。它将为您提供输入的完整文本以及最后键入的字符。杰出的这不是一个好办法。此方法在文本更改之前触发,因此您所查看的文本不是用户刚刚键入的,并且将替换字符串附加到现有文本也是不正确的,因为用户可能将文本插入到前一个字符串的中间,或者完全替换它(这就是为什么有一个范围参数)。省去你的麻烦,改用下面Chris的解决方案。此解决方案也会因退格或删除字符而中断,除非你手动调用
replaceCharactersRange
方法……与Ben的答案相比,此方法的优点是,文本更改后可以通知你。如果您使用
shouldchangeCharactersRange
您必须尝试计算允许编辑后字符串的外观。@Andrew-您这样说好像很难。只需使用
[[textField.text mutableCopy]replaceCharactersRange:range with string:string]
即可获得更改后的字符串。实际上,这并不容易。您需要添加一个局部变量来保存
[[textField.text]mutableCopy]
返回的NSMutableString,然后对该局部变量使用replace方法,然后对该局部变量执行任意操作,因为它返回的是void而不是更改的字符串。这就像champ!我用它来实时解析全名字段的名字和姓氏,这太完美了!这在ios 7中对我不起作用。我尝试了这一点,并添加了一个函数textdichange,但该函数从未被调用。我遇到了完全相同的问题。例如:如果textfield的文本是“Ha”,replacementString是“f”,如果我使用函数
-(BOOL)textfield:(UITextField*)textfield应该更改charactersinrange:(NSRange)range replacementString:(NSString*)string
,实际结果将是“Haf”,但预期结果应该是越南语中的“H”。