开发者

How can I get a textDidChange (like for a UISearchBar) method for a UITextField?

How can I get a textDidChange method for a UITextField? 开发者_StackOverflow社区I need to call a method every time a change is made to a text field. Is this possible? Thanks!


You can use the UITextFieldTextDidChangeNotification to call a method whenever the text field changes. Add this to your init:

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


You can setup a delegate and use

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


You can also a target & selector for the UIControlEventEditingChanged event. For example:

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

Note that this will only be called for user initiated changes to the text field and will not be called automatically when programmatically setting text.


Elaborating further on Ben Gottlieb's answer above, using textField shouldChangeCharactersInRange is great but has the disadvantage that some things can happen with a one character delay.

Eg calling the below to alert you when there is no text actually is called the character after, once you have enter a character and it is no longer empty.

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

    if (!textField.text.length) {
        // Do something with empty textfield
    }
    return YES;
 }

The below method allows you to get a rudimentary change happening in your textField. Although not quite as direct as an NSNotification it still allows you to use similar methods with different textFields and so is a pretty useful thing to use when trying to get specific character changes in your textfield.

The below code fixes the character delay

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

For this code is used to add a placeholder to a UITextField when there is no text in the textField


I found some problem when you use replaceCharactersInRange in delegate shouldChangeCharactersInRange.

Ex: In Vietnamese keyboard string aa -> â, So if you use method replaceCharactersInRange then Incorrect results.

You can try in this case by event UIControlEventEditingChanged:

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


Swift Solution

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


Below is what I used 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
}


Simply:

class MTextField: NSTextField {
    override func textDidChange(_ notification: Notification) {
        //...
    }
}

In Obj-C (not check):

@interface  MTextField: NSTextField
@end
@implementation  MTextField
- (void) textDidChange:(NSNotification*) notification {
    //...
}
@end
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜