Comment puis-je détecter des modifications de texte dans un textField? La méthode déléguée shouldChangeCharactersInRange
fonctionne pour quelque chose, mais elle ne répondait pas exactement à mes besoins. Depuis jusqu'à ce qu'il renvoie OUI, les textes textField ne sont pas disponibles pour les autres méthodes d'observation.
par exemple dans mon code calculateAndUpdateTextFields
n'a pas obtenu le texte mis à jour, l'utilisateur a tapé.
Est-ce leur moyen d'obtenir quelque chose comme textChanged
un gestionnaire d'événements Java.
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
if (textField.tag == kTextFieldTagSubtotal
|| textField.tag == kTextFieldTagSubtotalDecimal
|| textField.tag == kTextFieldTagShipping
|| textField.tag == kTextFieldTagShippingDecimal)
{
[self calculateAndUpdateTextFields];
}
return YES;
}
Réponses:
De la bonne façon de faire un rappel de changement de texte uitextfield :
Dans l'objectif-C:
Dans Swift:
Vous pouvez l' utiliser et de mettre calculateAndUpdateTextFields comme
selector
.la source
NO
, ce qui est logique, car lorsque vous revenezNO
de cette méthode, vous dites essentiellement que le texte dans le champ ne devrait pas changer.textField.text = "Some new value";
. Existe-t-il un moyen intelligent pour attraper cela?UITextFieldDelegate
que quelque chose comme çafunc textField: UITextField, didChangeText text: String
aurait été inclus, mais ... (donne aux gars d'Apple un air sale)La réponse de XenElement est parfaite.
Ce qui précède peut également être fait dans le générateur d'interface en cliquant avec le bouton droit sur UITextField et en faisant glisser l'événement d'envoi "Editing Changed" vers votre unité de sous-classe.
la source
pour définir l'écouteur d'événements:
écouter réellement:
la source
Rapide:
Ensuite, implémentez la fonction de rappel:
la source
Comme indiqué ici: Événement de changement de texte UITextField , il semble qu'à partir d'iOS 6 (iOS 6.0 et 6.1 vérifié), il n'est pas possible de détecter complètement les changements dans les
UITextField
objets simplement en observant leUITextFieldTextDidChangeNotification
.Il semble que seules les modifications apportées directement par le clavier iOS intégré soient suivies maintenant. Cela signifie que si vous changez votre
UITextField
objet simplement en invoquant quelque chose comme ceci:,myUITextField.text = @"any_text"
vous ne serez pas du tout informé des changements.Je ne sais pas si c'est un bug ou si c'est prévu. Cela ressemble à un bug car je n'ai trouvé aucune explication raisonnable dans la documentation. Ceci est également indiqué ici: événement de changement de texte UITextField .
Ma «solution» à cela consiste à publier une notification par moi-même pour chaque modification que j'apporte à mon
UITextField
(si cette modification est effectuée sans utiliser le clavier iOS intégré). Quelque chose comme ça:De cette façon, vous êtes sûr à 100% que vous recevrez la même notification lorsque vous modifiez la
.text
propriété de votreUITextField
objet, soit lorsque vous le mettez à jour "manuellement" dans votre code, soit via le clavier iOS intégré.Il est important de considérer que, comme ce n'est pas un comportement documenté, cette approche peut conduire à 2 notifications reçues pour le même changement dans votre
UITextField
objet. Selon vos besoins (ce que vous faites réellement lors de vosUITextField.text
changements), cela pourrait vous être gênant.Une approche légèrement différente consisterait à publier une notification personnalisée (c'est-à-dire avec un nom personnalisé autre que
UITextFieldTextDidChangeNotification
) si vous avez réellement besoin de savoir si la notification était la vôtre ou "conçue par iOS".ÉDITER:
Je viens de trouver une approche différente qui, je pense, pourrait être meilleure:
Cela implique la fonctionnalité Key-Value Observing (KVO) d'Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
Fondamentalement, vous vous enregistrez en tant qu'observateur d'une propriété et si cette propriété change, vous en êtes informé. Le "principe" est assez similaire à la façon dont
NSNotificationCenter
fonctionne, étant le principal avantage que cette approche fonctionne automatiquement aussi à partir d'iOS 6 (sans aucun ajustement spécial comme devoir publier manuellement des notifications).Pour notre
UITextField
scénario, cela fonctionne très bien si vous ajoutez ce code, par exemple, à votreUIViewController
qui contient le champ de texte:Crédit à cette réponse concernant la gestion du "contexte": https://stackoverflow.com/a/12097161/2078512
Remarque: Il semble que lorsque vous êtes en train de modifier un
UITextField
avec le clavier iOS intégré, la propriété "texte" du champ de texte n'est pas mise à jour à chaque nouvelle lettre tapée / supprimée. Au lieu de cela, l'objet de champ de texte est mis à jour "dans son ensemble" après avoir démissionné du statut de premier répondant du champ de texte.la source
Nous pouvons facilement configurer cela à partir de
Storyboard
, CTRL faites glisser l'@IBAction
événement et modifiez-le comme suit:la source
Ici en version rapide pour les mêmes.
Merci
la source
J'ai résolu le problème de modification du comportement de shouldChangeChractersInRange. Si vous retournez NON, les modifications ne seront pas appliquées par iOS en interne, mais vous avez la possibilité de le modifier manuellement et d'effectuer des actions après les modifications.
la source
Version Swift testée:
Explication des paramètres:
Ajoutez ensuite la méthode que vous avez créée ci-dessus dans votre
UIViewController
:la source
Swift 4
la source
Pour Swift 3.0:
en utilisant une classe comme:
la source
Version Swift 3
Et obtenez les changements ici
J'espère que cela aide.
la source
Vous devez utiliser la notification pour résoudre ce problème, car l'autre méthode écoutera la zone de saisie et non l'entrée réelle, en particulier lorsque vous utilisez la méthode de saisie chinoise. In viewDidload
puis
}
enfin, vous courez, c'est fait.
la source
Swift 3.1:
la source
Version Swift 3:
N'oubliez pas de définir le délégué.
la source
Avec fermeture:
et en utilisant
la source
KVO ne fonctionne PAS dans iOS pour les contrôles: http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html
Étant donné que vous connaissez la vue texte que vous souhaitez regarder:
Faites ceci:
Cependant, soyez prudent avec cela:
il est probable que vous ne souhaitiez l'appeler qu'une seule fois , alors ne l'appelez pas, par exemple,
layoutSubviews
il est assez difficile de savoir quand l'appeler au mieux pendant votre processus de rappel. Cela dépendra de votre situation. Malheureusement, il n'existe pas de solution standard verrouillée
par exemple, vous ne pouvez généralement pas l' appeler à
init
temps, car il sewatchedTextView
peut bien sûr qu'il n'existe pas encore.
Aucune des notifications n'est appelée lorsque le texte est modifié par programme .
C'est une énorme nuisance séculaire et stupide dans l'ingénierie iOS.
Les contrôles n'appellent tout simplement pas - fin de l'histoire - les notifications lorsque la propriété .text est modifiée par programme.
Ceci est incroyablement ennuyeux car bien sûr - évidemment - chaque application jamais créée définit le texte par programme, comme effacer le champ après les messages de l'utilisateur, etc.
Vous devez sous-classer la vue texte (ou un contrôle similaire) comme ceci:
(Astuce - n'oubliez pas que le super appel doit venir avant ! Le post-appel.)
Il n'y a pas de solution disponible, sauf si vous corrigez le contrôle en sous-classant comme indiqué ci-dessus. C’est la seule solution.
Notez que la notification
résulte en
être appelé.
( Non
textViewDidChange
.)la source
la source
Une chose est que vous pouvez avoir plusieurs UITextFields. Alors, donnez-leur une balise et ensuite vous pouvez activer les balises. Voici comment configurer un observateur dans n'importe quelle classe à peu près.
la source
Version Swift 4
Utilisation de l'observation des valeurs-clés Informez les objets des modifications apportées aux propriétés des autres objets.
la source