Utilisation du centre de notification, comme décrit dans Comment puis-je obtenir un TextDidChange (comme pour une méthode UiseearchBar) pour un Uitextfield? , vous permet d'obtenir une notification lorsque le texte de l'IOS Uitextfield change. Je n'ai pas vu de notification similaire pour les changements de sélection. Quelle est la meilleure façon de détecter et de répondre aux modifications de la sélection pour un Uitextfield? P>
4 Réponses :
Câblez une méthode à l'aide d'une cible / d'action dans l'événement Contrôle code> uicontroleventeDItingChanged code> sur votre instance de uitextfield code>. Cela peut être fait dans le constructeur d'interface ou dans le code en ajoutant une paire cible / action dans le champ de texte, puis implémentant la méthode spécifiée.
[self.textField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged];
UicontroleVenteDItingChanged code>
fait référence uniquement aux modifications du texte. C'est-à-dire que l'action ne tire que lorsque le texte change alors que le champ de texte est en identifiant code>. Cela n'inclut pas les changements de sélection.
Ce lien a une solution sans messager avec des API privées:
En bref: Sous-classe Uitextfield, implémenter P> et vérifier si la plage de sélection a changé. Mais cela ne notifie pas les robinets. P> Donc, ce que j'ai fait est après la sous-classement, observez la propriété Fonctionne très bien dans iOS8. P> p> sélectionnéeTextrange code> Propriété: p>
Pourquoi vous ne remplacez pas [UITEXTFIELD SETSELLECTEDTEXTROGANGE: (UITEXTROGANGE *) SELECTELLETEXTROGANGE] Si vous êtes de toute façon, Sous-classe Uitextfield? Ensuite, tous les changements viennent dans cet endroit.
@Leo 1. Je ne veux pas changer le comportement, obtenez seulement des notifications 2. Je viens de vérifier dans la cour de jeu et je pense que vous ne pouvez pas remplacer cette fonction.
Cela fonctionne pour moi (iOS 8 + 9). De cette façon, j'ourcez les besoins pour éliminer l'observateur à l'endroit approprié.
Votre choix, je ne remplacerais pas une méthode privée, mais probablement une chose de goût.
@Krisdigital Si vous remplacez SetSelectedTexTrange i> et dans son appel de mise en œuvre [Super SetSelectedTextrange: Texte] I>, vous maintiendrez le comportement original de la superclasse, mais aussi d'obtenir un point de notification
@Nalexn je sais, n'hésitez pas à remplacer à votre goût;)
Il existe un moyen simple de détecter la sélection dans Textfield
Ajouter un objet de propriété d'objet dans la vue ViewDidAppear P> puis ajouter une fonction d'observation pour la propriété P> [self.keyboardInputFieldPassword removeObserver:self forKeyPath:@"selectedTextRange" context:nil];