J'utilise le code ci-dessous pour essayer de faire textField2
en sorte que le contenu textuel de soit mis à jour pour correspondre à textField1
chaque fois que l'utilisateur tapetextField1
.
- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {
if (theTextField == textField1){
[textField2 setText:[textField1 text]];
}
}
Cependant, le résultat que j'observe est que ...
textField2 vaut "12", lorsque textField1 vaut "123"
textField2 est "123", lorsque textField1 est "1234"
... quand ce que je veux c'est:
textField2 est "123", lorsque textField1 est "123"
textField2 est "1234", lorsque textField1 est "1234"
Qu'est-ce que je fais mal?
ios
objective-c
uitextfield
user265961
la source
la source
Réponses:
-shouldChangeCharactersInRange
est appelé avant que le champ de texte ne modifie réellement son texte, c'est pourquoi vous obtenez une ancienne valeur de texte. Pour obtenir le texte après l'utilisation de la mise à jour:la source
[textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]
la source
Swift 3
Sur la base de la réponse acceptée, les éléments suivants devraient fonctionner dans Swift 3 :
Remarque
Les deux
String
etNSString
ont des méthodes appeléesreplacingCharacters:inRange:withString
. Cependant, comme prévu, le premier attend une instance deRange
, tandis que le second attend une instance deNSRange
. LatextField
méthode déléguée utilise uneNSRange
instance, donc l'utilisation deNSString
dans ce cas.la source
replacingCharacters
devrait êtrestringByReplacingCharactersInRange
Au lieu d'utiliser UITextFieldDelegate, essayez d'utiliser l' événement "Editing Changed" de UITextField.
la source
Dans Swift (4), sans
NSString
(Swift pur):En extension:
la source
Version Swift pour cela:
la source
C'est le code dont vous avez besoin,
la source
utiliser la garde
la source
Ma solution est d'utiliser
UITextFieldTextDidChangeNotification
.Ne pas oublier d'appeler
[[NSNotificationCenter defaultCenter] removeObserver:self];
à ladealloc
méthode.la source
Si vous devez remplacer le texte du champ de texte par celui-ci, vous pouvez utiliser ma solution (Swift 3): https://gist.github.com/Blackjacx/2198d86442ec9b9b05c0801f4e392047
Après le remplacement, vous pouvez simplement
textField.text
récupérer le texte composé.la source