Avec Swift 5 et iOS 12, essayez l'implémentation suivante de la textField(_:shouldChangeCharactersIn:replacementString:)
méthode qui fait partie du UITextFieldDelegate
protocole:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
- La partie la plus importante de ce code est la conversion de
range
( NSRange
) en rangeOfTextToReplace
( Range<String.Index>
). Consultez ce didacticiel vidéo pour comprendre pourquoi cette conversion est importante.
- Pour que ce code fonctionne correctement, vous devez également définir la valeur de
textField
s smartInsertDeleteType
sur UITextSmartInsertDeleteType.no
. Cela empêchera l'insertion possible d'un espace supplémentaire (indésirable) lors de l'exécution d'une opération de collage.
L'exemple de code complet ci-dessous montre comment implémenter textField(_:shouldChangeCharactersIn:replacementString:)
dans un UIViewController
:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard
override func viewDidLoad() {
super.viewDidLoad()
textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
textField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
}
text.characters.count
utilisation est déconseilléetext.count
Je fais ça comme ça:
Le code fonctionne pour moi. Mais je travaille avec le storyboard. Dans Storyboard, j'ajoute une action pour le champ de texte dans le contrôleur de vue lors de l' édition modifiée .
la source
Mise à jour pour Swift 4
la source
Ajoutez plus de détails à partir de la réponse @Martin
la source
Dans Swift 4
Limite de 10 caractères pour le champ de texte et autoriser la suppression (retour arrière)
la source
un petit changement pour IOS 9
la source
Swift 3
la source
vous pouvez étendre UITextField et ajouter un
@IBInspectable
objet pour le gérer:SWIFT 5
et après cela définissez-le sur l'inspecteur d'attributs
Voir la réponse originale de Swift 4
la source
Si vous souhaitez écraser la dernière lettre:
la source
J'ai publié une solution à l'aide de
IBInspectable
, afin que vous puissiez modifier la valeur de longueur maximale à la fois dans le générateur d'interface ou par programme. Vérifiez le icila source
Vous pouvez utiliser dans swift 5 ou swift 4 comme l' image ci-dessous
ajouter le code dans la vue ViewController
Vous pouvez télécharger le formulaire source complet GitHub: https://github.com/enamul95/TextFieldMaxLen
la source
Méfiez-vous du bogue d'annulation pour UITextField mentionné dans cet article: Définissez la longueur de caractère maximale d'un UITextField
voici comment résoudre le problème rapidement
la source
la source
J'utilise ce protocole / extension dans l'une de mes applications, et c'est un peu plus lisible. J'aime la façon dont il reconnaît les espaces arrière et vous indique explicitement quand un personnage est un retour arrière.
Quelques points à considérer:
Tout ce qui implémente cette extension de protocole doit spécifier une limite de caractères. Ce sera généralement votre ViewController, mais vous pouvez implémenter une limite de caractères en tant que propriété calculée et renvoyer quelque chose d'autre, par exemple une limite de caractères sur l'un de vos modèles.
2. Vous devrez appeler cette méthode à l'intérieur de la méthode de délégué shouldChangeCharactersInRange de votre champ de texte. Sinon, vous ne pourrez pas bloquer la saisie de texte en renvoyant false, etc.
3. Vous souhaiterez probablement autoriser les caractères de retour arrière. C'est pourquoi j'ai ajouté la fonction supplémentaire pour détecter les backspaces. Votre méthode shouldChangeCharacters peut vérifier cela et renvoyer «true» dès le début afin que vous autorisiez toujours les espaces arrière.
Si l'un d'entre vous est intéressé, j'ai un repo Github dans lequel j'ai pris une partie de ce comportement de limite de caractère et mis dans un cadre iOS. Il existe un protocole que vous pouvez implémenter pour obtenir un affichage de la limite de caractères de type Twitter qui vous montre jusqu'où vous êtes allé au-dessus de la limite de caractères.
CharacterLimited Framework sur Github
la source
Puisque les délégués sont une relation 1 à 1 et que je pourrais vouloir l'utiliser ailleurs pour d'autres raisons, j'aime limiter la longueur du champ de texte en ajoutant ce code dans leur configuration:
la source
Im en utilisant ceci;
Limite de 3 caractères
la source
Swift 5
la source
Vous devez vérifier si la chaîne existante plus l'entrée est supérieure à 10.
la source