Comment puis-je obtenir une méthode textDidChange pour un UITextField? J'ai besoin d'appeler une méthode chaque fois qu'une modification est apportée à un champ de texte. Est-ce possible? Merci!Comment puis-je obtenir une méthode textDidChange (comme pour un UISearchBar) pour un UITextField?
Comment puis-je obtenir une méthode textDidChange (comme pour un UISearchBar) pour un UITextField?
Répondre
Vous pouvez configurer un délégué et utiliser
- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string;
Vous pouvez utiliser le UITextFieldTextDidChangeNotification
pour appeler une méthode lorsque le champ de texte change. Ajoutez ceci à votre init
:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:nil];
Le Advantag e à cette méthode sur la réponse de Ben est que vous pouvez être notifié * après * le texte change. Si vous utilisez 'shouldChangeCharactersInRange' vous devez essayer de calculer à quoi ressemblera la chaîne une fois la modification autorisée. – Andrew
@Andrew - Vous dites ça comme si c'était dur. Utilisez simplement '[[textField.text mutableCopy] replaceCharactersInRange: range withString: string] 'pour obtenir la chaîne post-modification. – ArtOfWarfare
En fait, ce n'est pas si facile. Vous devez ajouter une variable locale pour contenir le NSMutableString retourné par '[[textField.text] mutableCopy]', puis utiliser la méthode replace sur cette variable locale, puis faire ce que vous voulez avec la variable locale, juste parce qu'elle renvoie void plutôt que la chaîne modifiée. – ArtOfWarfare
Précisant sur la réponse de Ben Gottlieb ci-dessus, en utilisant textField shouldChangeCharactersInRange est grande, mais présente l'inconvénient que certaines choses peuvent se produire avec un retard d'un caractère.
Par exemple, appeler le texte ci-dessous pour vous avertir quand il n'y a pas de texte est appelé le caractère après, une fois que vous avez entré un caractère et qu'il n'est plus vide.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if (!textField.text.length) {
// Do something with empty textfield
}
return YES;
}
La méthode ci-dessous vous permet d'obtenir un changement rudimentaire dans votre zone de texte. Bien qu'il ne soit pas aussi direct qu'une NSNotification, il vous permet d'utiliser des méthodes similaires avec textFields différents et est donc très utile lorsque vous essayez d'obtenir des changements de caractères spécifiques dans votre champ de texte.
Le code ci-dessous fixe le délai de caractères
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// This means it updates the name immediately
NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
textField.placeholder = newString.length ? @"" : @"Name";
return YES;
}
Ce code est utilisé pour ajouter un espace réservé à un UITextField quand il n'y a pas de texte dans le champ de texte
Solution Swift
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
return true
}
Vous pouvez également choisir un sélecteur & pour l'événement UIControlEventEditingChanged
. Par exemple:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]
Notez que ce ne sera appelé à des changements initiés par l'utilisateur dans le champ de texte et ne sera pas appelée automatiquement lorsque le texte mise en programmation.
J'ai trouvé un problème lorsque vous utilisez replaceCharactersInRange dans le délégué shouldChangeCharactersInRange.
Ex: Dans la chaîne du clavier vietnamien "aa" -> "ã", donc si vous utilisez la méthode replaceCharactersInRange puis des résultats incorrects
Vous pouvez dans ce cas par cas UIControlEventEditingChanged:
[textField addTarget: action auto: @selector (textFieldDidChange :) forControlEvents: UIControlEventEditingChanged]
J'ai eu exactement le même problème. Par exemple: Si le texte du champ de texte est "Ha" et que remplacementString est "f" et si j'utilise la fonction '- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range chaîneChaîne: (NSString *) chaîne', le le résultat actuel sera "Haf" mais le résultat attendu devrait être "Hà" en vietnamien. –
Voici ce que je Swift 4
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let fieldText = textField.text else {
return false
}
// Append the existing textfield text with the new character
var text = fieldText + string
// If it is the very first character, textfield text will be empty so take the 'string' and on delete also textfield text get deleted with a delay
if range.location == 0{
text = string
}
return true
}
- 1. UISearchBar textDidChange Retards pour les appels à distance
- 2. UISearchBar: textDidChange: renvoie une valeur vide?
- 3. Comment obtenir une notification pour un cache UISearchBar?
- 4. comment obtenir un UITextView à effacer comme un UITextField fait
- 5. Fonctionnalité UISearchBar via UITextField
- 6. Comment obtenir une chaîne depuis un UITextField?
- 7. handle touchesBegan méthode pour UITextField dans UIScrollView
- 8. Comment obtenir l'objet Method pour une méthode?
- 9. UISearchBar teinté comme Contacts
- 10. Obtenir une méthode sans paramètre pour agir comme un Func <ReturnT>
- 11. UISearchBar dans un UITableView
- 12. UIWebView avec UISearchBar pour la recherche
- 13. implémenter touchesBegan pour UITextField
- 14. Comment sélectionner un objet UITextField?
- 15. System.out.println() est une méthode pour un champ?
- 16. Ajouter un bouton dans un UITableViewCell lorsque UISearchBar n'a aucun résultat (comme l'application Mail)
- 17. Comment créer une méthode pour un objet personnalisé en JavaScript?
- 18. Fonction comme un argument à une méthode
- 19. Comment écrire une méthode pour un plugin jQuery?
- 20. iPhone effectuer une action lorsque le bouton d'effacement de UITextField/UISearchBar est pressé
- 21. Méthode jQuery pour obtenir un nœud - plutôt que find();
- 22. Comment utiliser la méthode drawTextInRect de UITextField: méthode
- 23. Obtenir le cadre de UITextField dans UITableView pour afficher UIPopover
- 24. Comment obtenir une déclaration C# complète pour un type?
- 25. Comment créer un UITextField défilant dans UItableViewCell?
- 26. Obtenir un ResourceManager pour une bibliothèque statique
- 27. Comment appliquer une couleur unie à un UISearchBar
- 28. aide System.Reflection pour obtenir un nom complet de la méthode
- 29. méthode propre pour obtenir une entrée dans une liste et le définir comme la première entrée
- 30. Comment faire pour inverser un nombre comme un entier et non comme une chaîne?
Merci! Cela a fonctionné à merveille. Je devais faire ce qui suit pour obtenir la chaîne complète: \t NSMutableString * textFieldString = [NSMutableString stringWithString: textField.text]; [textFieldString appendString: string]; – Jonah
Pour tous vous noobs comme moi là-bas. Ceci est une méthode déléguée que vous déposez en l'état. Il vous donnera le texte complet entré plus le dernier caractère tapé. Excellent! –
Ce n'est pas une bonne approche. Cette méthode se déclenche avant que le texte ne change, donc le texte que vous regardez n'est pas ce que l'utilisateur vient de taper et l'ajout de la chaîne de remplacement au texte existant n'est pas correct car l'utilisateur pourrait insérer le texte au milieu de la chaîne précédente ou en le remplaçant complètement (c'est pourquoi il y a un paramètre de plage). Sauvez-vous un mal de tête et utilisez plutôt la solution de Chris ci-dessous. –