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

时间:2009-12-17 04:13:50

标签: iphone uitextfield

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

7 个答案:

答案 0 :(得分:47)

只要文本字段发生变化,您就可以使用UITextFieldTextDidChangeNotification来调用方法。将其添加到您的init

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

答案 1 :(得分:20)

您可以设置代理并使用

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

答案 2 :(得分:3)

你也可以成为目标& UIControlEventEditingChanged事件的选择器。例如:

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

请注意,这只会在用户启动的文本字段更改时调用,并且在以编程方式设置文本时不会自动调用。

答案 3 :(得分:1)

进一步阐述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;
 }

以下方法可让您在textField中进行基本更改。尽管不像NSNotification那样直接,它仍允许您使用不同textFields的类似方法,因此在尝试在文本字段中进行特定字符更改时使用它是非常有用的。

以下代码修复了字符延迟

- (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;
 } 

此代码用于在textField中没有文本时将占位符添加到UITextField

答案 4 :(得分:1)

我在委托shouldChangeCharactersInRange中使用replaceCharactersInRange时发现了一些问题。

例如:越南语键盘字符串aa - > â,因此,如果您使用方法replaceCharactersInRange,则结果不正确。

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

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

答案 5 :(得分:0)

快速解决方案

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

答案 6 :(得分:0)

以下是我使用的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
}