2009-12-17 5 views

Répondre

20

Vous pouvez configurer un délégué et utiliser

- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string; 
+3

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

+0

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! –

+9

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. –

46

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]; 
+4

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

+0

@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

+0

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

1

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

0

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 
} 
3

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.

1

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]

+0

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. –

0

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 
} 
Questions connexes