620 votes

Événement de modification de texte UITextField

Comment puis-je détecter toute modification de texte dans un textField ? La méthode déléguée `` fonctionne pour quelque chose, mais il n’a pas rempli mon besoin exactement. Jusqu'à ce qu’elle renvoie Oui, les textes de textField n’étant pas disponibles à d’autres méthodes d’observation.

par exemple dans mon code `` n’a pas obtenu le texte mis à jour, le texte tapé par l’utilisateur.

Est leur est-il possible d’obtenir quelque chose comme `` Gestionnaire d’événements de Java.

1138voto

XenElement Points 5865

De bonne façon de faire uitextfield changement de texte de retour d'appel:

J'attrape les caractères qui est envoyé à un objet UITextField contrôler quelque chose comme ceci:

// Add a "textFieldDidChange" notification method to the text field control.
[textField addTarget:self 
              action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged];

Puis, dans la textFieldDidChange: méthode, vous pouvez examiner le contenu de la zone de texte, et de recharger votre vue de la table en tant que de besoin.

Vous pourriez l'utiliser et de mettre calculateAndUpdateTextFields que votre selector.

416voto

William T. Points 1879

OK réponse est sur place.

Ce qui précède peut être fait dans interface builder trop en cliquant-droit sur le UITextField et en faisant glisser la « modification d’édition » Envoyer événement à votre unité de sous-classe.

UITextField Change Event

140voto

asdf Points 279

pour configurer l’écouteur d’événements :

à l’écoute en fait :

@all réponses : s’il vous plaît écrivez la réponse complète. J’ai trouvé ce côté ici parce que j’ai eu le même problème. Vos réponses m’a dit comment définir l’écouteur d’événements, mais personne n’a écrit la deuxième partie de ma réponse...

33voto

ercolemtar Points 159

Comme indiqué ici: UITextField changement de texte de l'événement, il semble que comme d'iOS 6 (iOS 6.0 et 6.1 vérifié) il n'est pas possible de détecter les changements dans UITextField des objets simplement par l'observation de l' UITextFieldTextDidChangeNotification.

Il semble que seuls les changements effectués directement par le haut-clavier iOS sont suivis maintenant. Cela signifie que si vous changez d' UITextField objet juste en invoquant quelque chose comme ceci: myUITextField.text = @"any_text", vous ne serez pas averti de tout changement à tous.

Je ne sais pas si c'est un bug ou c'est prévu. Semble comme un bug car je n'ai pas trouvé d'explication raisonnable dans la documentation. C'est aussi indiqué ici: UITextField texte de modifier l'événement.

Ma "solution" à ce, est en fait de publier une notification par moi-même pour tous les changement que j'ai fait à ma UITextField (si ce changement se fait sans l'aide de l'intégré dans le clavier iOS). Quelque chose comme ceci:

myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";

NSNotification *myTextFieldUpdateNotification  = 
  [NSNotification notificationWithName:UITextFieldTextDidChangeNotification
                  object:myUITextField];

[NSNotificationCenter.defaultCenter 
  postNotification:myTextFieldUpdateNotification];

De cette façon, vous êtes confiant à 100% que vous recevrez la même notification lorsque vous modifiez l' .text de la propriété de votre UITextField objet, soit lors de la mise à jour "manuellement" dans votre code ou par le biais de l'intégré dans le clavier iOS.

Il est important de considérer que, puisque ce n'est pas un comportement documenté, cette approche peut conduire à 2 notifications reçues pour le même changement dans votre UITextField objet. En fonction de vos besoins (ce que vous faites quand votre UITextField.text des changements) ce pourrait être un inconvénient pour vous.

Une approche légèrement différente serait de poster une coutume de notification (ce qui est, avec un nom personnalisé autre que UITextFieldTextDidChangeNotification) si vous avez réellement besoin de savoir si la notification a été le vôtre ou "iOS".

EDIT:

Je viens de trouver une approche différente, qui je pense pourrait être mieux:

Cela implique la Clé-Valeur d'Observation (KVO) fonction d'Objective-C (http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA).

Essentiellement, vous devez vous inscrire vous-même comme un observateur de la propriété et si cette propriété modifications que vous soyez informé à ce sujet. Le "principe" est tout à fait similaire à la façon dont NSNotificationCenter œuvres, le principal avantage de cette approche fonctionne aussi comme de l'iOS 6 (sans le tordre comme ayant à la main poster des notifications).

Pour notre UITextField-scénario cela fonctionne bien si vous ajoutez ce code, par exemple, votre UIViewController qui contient le champ de texte:

static void *myContext = &myContext;

- (void)viewDidLoad {
  [super viewDidLoad];

  //Observing changes to myUITextField.text:
  [myUITextField addObserver:self forKeyPath:@"text"
    options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld 
    context:myContext];

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {

  if(context == myContext) {
    //Here you get notified every time myUITextField's "text" property is updated
    NSLog(@"New value: %@ - Old value: %@",
      [change objectForKey:NSKeyValueChangeNewKey],
      [change objectForKey:NSKeyValueChangeOldKey]);
  }
  else 
    [super observeValueForKeyPath:keyPath ofObject:object 
      change:change context:context];

}

Crédit pour cette réponse concernant le "contexte" de la gestion: http://stackoverflow.com/a/12097161/2078512

Note: il Semble que lorsque vous êtes dans le processus de modification d'un UITextField intégré dans iOS clavier, le "texte" de la propriété du champ de texte n'est pas mis à jour avec chaque nouvelle lettre dactylographiée/supprimé. Au lieu de cela, l'objet de champ de texte est mise à jour "dans son ensemble" après la démission du premier répondant état du champ de texte.

13voto

Pauls Points 251

J’ai résolu le problème en modifiant le comportement de shouldChangeChractersInRange. Si vous retournez pas les changements n’est pas appliquées par iOS en interne, au lieu de cela, vous avez la possibilité de modifier manuellement et effectuer une action après les modifications.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X