How can I detect a KeyPress event in UITextField?

2019-06-17 08:32发布

问题:

In UITextView there is a Changed event to handle keypress. However the UITextField has not such event.

How can I detect a KeyPress event in UITextField?

There is a method described here using notifications, however the problem I have is that I cannot unsubscribe from the TextFieldTextDidChangeNotification.

回答1:

I'm not sure which is your question. The first one you seem to have answered yourself, i.e. the solution (from your link) is to use NSNotificationCenter.DefaultCenter.AddObserver.

The second is about unsubscribing - if you want to stop observing you should call the previous method counterpart, i.e. NSNotificationCenter.DefaultCenter.RemoveObserver.

Just keep the object returned from AddObserver so you can supply it to RemoveObserver.

note: If I did not understand your question correctly please use edit and add some details and/or code of what you want to achieve and we'll do our best to help :-)



回答2:

As colinta suggested, do this

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  NSString *text = [textField.text stringByReplacingCharactersInRange:range withString:string];
  NSLog(@"range = %@, replacement = %@, text = %@", NSStringFromRange(range), string, text);
  return YES;
}

and

- (BOOL)textFieldShouldClear:(UITextField *)textField {
  NSLog(@"clear text");
  return YES;
}

It will also work if the input was changed via spelling suggestions.



回答3:

Look at the UITextFieldDelegate

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITextFieldDelegate_Protocol/UITextFieldDelegate/UITextFieldDelegate.html

Implement that protocol. It has call back methods for all the text field changes.



回答4:

The cleanest way to observe UITextField changes is

_textField.AddTarget((sender, e) =>
{
    // Do your stuff in here
}, UIControlEvent.EditingChanged);

You don't have to subscribe to a system-wide notification center and you don't have to unregister observer when you're destroing a text field.

Hope this will help someone in the future :)