Définissez le nombre maximal de caractères d'un objet UITextField en Swift
Je sais qu'il y a d'autres sujets sur ce sujet, mais je n'arrive pas à trouver comment la mettre en œuvre.
J'essaie de limiter un UITextField à seulement 5 Caractères
De préférence Alphanumériques et - et . et _
J'ai vu ce code
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange,
replacementString string: String) -> Bool
{
let maxLength = 4
let currentString: NSString = textField.text
let newString: NSString =
currentString.stringByReplacingCharactersInRange(range, withString: string)
return newString.length <= maxLength
}
et
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let length = count(textField.text.utf16) + count(string.utf16) - range.length
return length <= 10
}
Je ne sais pas comment la mettre en œuvre ou qui "textfield" dois-je échanger mon nom personnalisé UITextField
- Swift 4 mise en œuvre de stackoverflow.com/a/46513151/2303865
Vous devez vous connecter pour publier un commentaire.
Votre point de vue contrôleur doit être conforme à
UITextFieldDelegate
, comme ci-dessous:Définir le délégué de votre textfield:
myTextField.delegate = self
textField(_:shouldChangeCharactersInRange:replacementString:)
Tous ensemble:
Pour Swift 4
Permettant seulement d'un ensemble spécifié de caractères à saisir dans un champ de texte
Comment programmer un iOS champ de texte qui ne prend que l'entrée numérique d'une longueur maximale
textField
dans la méthodefunc textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
shouldChangeCharactersInRange
est appelé, c'est pour tous les objets textfield, vous recevez le rappel à la même placeshouldChangeCharactersInRange
et à l'intérieur de cette méthode, vous pouvez savoir qui textfield est édité grâce à l'passées en paramètretextField
vous pouvez par exemple donner une étiquette pour chaque champ de texte et de test à l'intérieur de lashouldChangeCharactersInRange
et pour chaque textfield effectuer la validation du contenuif mytextField == numberField {
pour vérifier la zone de texte est en cours de modification. editingChanged
complètement poignées de toutes ces questions.Décembre 2017. Swift 4.
Prendre soin que beaucoup de l'exemple de code que vous voyez en ligne sur ce problème est très en dehors de la date.
Il suffit de coller le texte suivant dans toute Swift fichier dans votre projet. Nom du fichier quoi que ce soit, par exemple, "à portée de main.swift"
Ce corrige enfin l'un de la plus stupide des problèmes dans iOS:
Vos champs de texte ont maintenant une
.maxLength
.Il est complètement OK pour le mettre en valeur dans le storyboard au cours du développement, ou, définie dans le code, tandis que l'application est en cours d'exécution.
C'est aussi simple que cela.
(Note: "safelyLimitedTo#longueur" est juste un appel qui réduit la longueur d'une Chaîne. Tous les Swift programmeurs ont leur propre extension pour qui, ou, il suffit d'utiliser la mine, qui que vous y voyez.)
Un moyen encore plus simple one-off version...
Ci-dessus résout tous les champs de texte dans votre projet.
Si vous voulez juste un particulier champ de texte pour simplement se limiter à dire "4", et c'est ce que...
Ouf! C'est tout là est à lui.
(Juste BTW, voici une semblable astuce très utile concernant UITextVue,
https://stackoverflow.com/a/42333832/294884 )
self.characters
est obsolète. Il est maintenant justelet c = self
super.didMoveToSuperview()
"L'implémentation par défaut de cette méthode ne fait rien. Les sous-classes peuvent le remplacer pour effectuer des actions supplémentaires à chaque fois que le superview changements." Considérant qu'il est un appel à super pour cette méthode est inutileSwift 4, il suffit d'utiliser:
De la même façon Steven Schmatz, mais elle n'utilisant Swift 3.0 :
Je pense que l'extension est plus pratique pour cela. Voir la réponse complète ici
D'autres solutions posté au-dessus de produire un cycle de conserver en raison de la zone de texte de la carte. En outre, la
maxLength
propriété doit prendre la valeur null si pas de jeu au lieu d'artificielInt.max
constructions; et la cible sera définie plusieurs fois si maxLength est changé.Ici un solution mise à jour pour Swift4 avec une faible carte pour empêcher les fuites de mémoire et les autres correctifs
Mon Swift 4 version de
shouldChangeCharactersIn
J'ai quelque chose à ajouter à Aladin réponse:
Votre point de vue contrôleur doit être conforme à
UITextFieldDelegate
Définir le délégué de votre textfield:
Pour définir le délégué, vous pouvez contrôler faites glisser la zone de texte à votre vue-contrôleur dans le storyboard. Je pense que c'est préférable de la mettre dans le code
Mettre en œuvre la méthode dans votre vue-contrôleur :
textField(_:shouldChangeCharactersInRange:replacementString:)
Je donne une réponse supplémentaire basé sur @Frouo. Je pense que sa réponse est la plus belle manière. Parce que c'est une commande que nous pouvons réutiliser. Et il n'y a pas de problème de fuite ici.
Cette réponse est pour Swift 4, et est assez simple avec la possibilité de permettre le retour arrière à travers.
Solution Simple sans l'aide d'un délégué:
De Travail Dans Swift4
//ÉTAPE 1 jeu UITextFieldDelegate
//ÉTAPE 2 définir délégué
userMobileNoTextFiled.delegate = self //set délégué
}
//ÉTAPE 3 appelez func
mise à jour de cette Fattie répondre
Voici une Swift 3.2+ alternative qui évite la manipulation de la chaîne. Dans ce cas, la longueur maximale est de 10:
- Je utiliser cette étape, Définissez d'abord délégué texfield dans le viewdidload.
et puis shouldChangeCharactersIn après vous d'inclure UITextFieldDelegate.
Il suffit juste de vérifier le nombre de caractères dans la chaîne
classe YorsClassName : UITextFieldDelegate {
}
func textField(_ textField: UITextField, shouldChangeCharactersIn gamme: NSRange, replacementString string: String) -> Bool {
si textField.texte?.count == 1 {
return false
}
return true
}
Remarque: Ici, j'ai vérifié pour le seul caractère de permis dans textField