Comment puis-je définir le nombre maximal de caractères dans un UITextField
sur le SDK iPhone lorsque je charge un UIView
?
ios
objective-c
cocoa-touch
uitextfield
Domness
la source
la source
Réponses:
Bien que la
UITextField
classe n'ait pas de propriété de longueur maximale, il est relativement simple d'obtenir cette fonctionnalité en définissant les champs de textedelegate
et en implémentant la méthode déléguée suivante:Objectif c
Rapide
Avant que le champ de texte ne change, l'UITextField demande au délégué si le texte spécifié doit être modifié. Le champ de texte n'a pas changé à ce stade, nous prenons donc sa longueur actuelle et la longueur de chaîne que nous insérons (soit en collant du texte copié ou en tapant un seul caractère à l'aide du clavier), moins la longueur de la plage. Si cette valeur est trop longue (plus de 25 caractères dans cet exemple), revenez
NO
pour interdire la modification.Lorsque vous saisissez un seul caractère à la fin d'un champ de texte, le
range.location
sera la longueur du champ actuel etrange.length
sera 0 car nous ne remplaçons / supprimons rien. L'insertion au milieu d'un champ de texte signifie simplement une différencerange.location
, et le collage de plusieurs caractères signifie simplement qu'il ystring
a plus d'un caractère.La suppression de caractères uniques ou la découpe de plusieurs caractères est spécifiée par un
range
avec une longueur non nulle et une chaîne vide. Le remplacement est simplement une suppression de plage avec une chaîne non vide.Une note sur le bug "d'annulation" qui plante
Comme mentionné dans les commentaires, il y a un bug
UITextField
qui peut conduire à un crash.Si vous collez dans le champ, mais que le collage est empêché par votre implémentation de validation, l'opération de collage est toujours enregistrée dans le tampon d'annulation de l'application. Si vous déclenchez ensuite une annulation (en secouant l'appareil et en confirmant une annulation), le
UITextField
tentera de remplacer la chaîne qu'il pense qu'elle s'est collée à elle-même par une chaîne vide. Cela se bloque parce qu'il n'a jamais fait coller la chaîne pour lui - même. Il essaiera de remplacer une partie de la chaîne qui n'existe pas.Heureusement, vous pouvez protéger le
UITextField
de se tuer comme ça. Vous avez juste besoin de faire en sorte que la gamme qu'il propose de remplacer ne exist dans son chaîne actuelle. C'est ce que fait le premier contrôle d'esprit ci-dessus.swift 3.0 avec copier-coller fonctionne bien.
J'espère que cela vous sera utile.
la source
return newLength <= 25;
UITextField
sur iPad iOS 8.1. (+1 pour commenter). L'auteur ajouterait-il quelque chose à ce sujet car c'est la réponse la mieux notée? Je suis heureux de faire un montage, mais le mien semble régulièrement rejeté! :-)Swift 4
Edit: problème de fuite de mémoire corrigé.
la source
Merci août! ( Message )
Voici le code avec lequel j'ai fini et qui fonctionne:
la source
return textField.text.length < MAX_LENGTH || range.length != 0;
Pour compléter la réponse du mois d'août , une implémentation possible de la fonction proposée (voir délégué UITextField ).
Je n'ai pas testé le code domness , mais le mien ne se bloque pas si l'utilisateur atteint la limite, et il est compatible avec une nouvelle chaîne qui vient remplacer une plus petite ou égale.
la source
Vous ne pouvez pas le faire directement -
UITextField
n'a pas d' attribut maxLength , mais vous pouvez définir leUITextField's
délégué, puis utiliser:la source
Vous disposez souvent de plusieurs champs de saisie de longueur différente.
la source
La meilleure façon serait de mettre en place une notification sur le changement de texte. Dans votre
-awakeFromNib
méthode de contrôleur de vue, vous souhaiterez:Ensuite, dans la même classe, ajoutez:
Reliez ensuite la prise
myTextField
à votreUITextField
et il ne vous permettra plus d'ajouter de personnages après avoir atteint la limite. Assurez-vous d'ajouter ceci à votre méthode de désallocation:la source
J'ai créé cette sous-classe UITextFieldLimit:
Saisissez le
UITextFieldLimit.h
et àUITextFieldLimit.m
partir de ce référentiel GitHub:https://github.com/JonathanGurebo/UITextFieldLimit
et commencez à tester!
Marquez votre UITextField créé par le storyboard et liez-le à ma sous-classe à l'aide de l'inspecteur d'identité:
Vous pouvez ensuite le lier à un IBOutlet et définir la limite (la valeur par défaut est 10).
Votre fichier ViewController.h doit contenir: (si vous ne souhaitez pas modifier le paramètre, comme la limite)
Votre fichier ViewController.m devrait
@synthesize textFieldLimit
.Définissez la limite de longueur du texte dans votre fichier ViewController.m:
J'espère que la classe vous aidera. Bonne chance!
la source
Cela devrait suffire à résoudre le problème (remplacez 4 par la limite que vous voulez). Assurez-vous simplement d'ajouter un délégué dans IB.
la source
Utilisez l'extension ci-dessous pour définir la longueur maximale des caractères de a
UITextField
etUITextView
.Swift 4.0
UITextView
Vous pouvez définir une limite ci-dessous.
la source
Je simule le remplacement de chaîne réel qui est sur le point de se produire pour calculer la longueur de cette future chaîne:
la source
Version Swift 3 // ***** Cela ne fonctionnera PAS avec Swift 2.x! ***** //
Créez d'abord un nouveau fichier Swift: TextFieldMaxLength.swift, puis ajoutez le code ci-dessous:
puis vous verrez dans Storyboard un nouveau champ (longueur maximale) lorsque vous sélectionnez un TextField
Si vous avez encore des questions, consultez ce lien: http://www.globalnerdy.com/2016/05/18/ios-programming-trick-how-to-use-xcode-to-set-a-text-fields -style visuel-studio-longueur maximale /
la source
En utilisant le générateur d'interface, vous pouvez lier et obtenir l'événement pour "Modification modifiée" dans n'importe laquelle de vos fonctions. Maintenant, vous pouvez vérifier la longueur
la source
Le code suivant est similaire à la réponse de malade, mais gère correctement les opérations de copier-coller. Si vous essayez de coller un texte plus long que la limite, le code suivant tronquera le texte pour qu'il corresponde à la limite au lieu de refuser complètement l'opération de collage.
la source
Il existe une solution générique pour définir la longueur maximale dans Swift. Par IBInspectable, vous pouvez ajouter un nouvel attribut dans Xcode Attribute Inspector.
la source
Pour le faire fonctionner avec un copier-coller de chaînes de n'importe quelle longueur, je suggère de changer la fonction en quelque chose comme:
la source
Swift 4
la source
guard
?Swift 2.0 +
Créez d'abord une classe pour ce processus. Appelons-le StringValidator.swift.
Ensuite, collez simplement le code suivant à l'intérieur.
Maintenant, sauvez la classe .....
Usage..
Maintenant, passez à votre classe viewController.swift et définissez les sorties de votre champ de texte comme ..
Maintenant, passez à la méthode shouldChangeCharactersInRange du champ de texte et utilisez comme suit.
N'oubliez pas de définir le protocole délégué / les méthodes des champs de texte.
Permettez-moi de vous expliquer à ce sujet ... J'utilise le processus d'extension simple de chaîne que j'ai écrit dans une autre classe. Maintenant, j'appelle simplement ces méthodes d'extension à partir d'une autre classe où j'en ai besoin en ajoutant une vérification et une valeur maximale.
Caractéristiques...
Les types...
containsOnlyCharactersIn // Accepte uniquement les caractères.
containsCharactersIn // Accepte une combinaison de caractères
doesNotContainsCharactersIn // N'accepte pas les caractères
J'espère que cela a aidé .... Merci ..
la source
swift 3.0
Ce code fonctionne correctement lorsque vous collez une chaîne plus que vos limites de caractères.
Merci pour vos votes. :)
la source
Je donne une réponse supplémentaire basée sur @Frouo. Je pense que sa réponse est la plus belle manière. Parce que c'est un contrôle commun que nous pouvons réutiliser.
la source
C'est la bonne façon de gérer la longueur maximale sur UITextField, cela permet à la touche de retour de quitter le champ de texte en tant que premier répondeur et permet à l'utilisateur de revenir en arrière lorsqu'ils atteignent la limite
la source
Qu'en est-il de cette approche simple. Cela fonctionne bien pour moi.
Alors:
la source
D'autres réponses ne gèrent pas le cas où l'utilisateur peut coller une longue chaîne à partir du presse-papiers. Si je colle une longue chaîne, elle devrait simplement être tronquée mais affichée. Utilisez ceci dans votre délégué:
la source
Je l'ai réduit à 1 ligne de code :)
Définissez le délégué de votre affichage de texte sur "self" puis ajoutez le
<UITextViewDelegate>
dans votre .h et le code suivant dans votre .m .... vous pouvez ajuster le nombre "7" pour qu'il soit ce que vous voulez que votre nombre MAXIMUM de caractères soit.Ce code prend en compte la saisie de nouveaux caractères, la suppression de caractères, la sélection de caractères, puis la saisie ou la suppression, la sélection de caractères et la découpe, le collage en général et la sélection de caractères et le collage.
Terminé!
Alternativement, une autre façon intéressante d'écrire ce code avec des opérations sur les bits serait
la source
J'ai ouvert une sous-classe UITextField, STATextField , qui offre cette fonctionnalité (et bien plus) avec sa
maxCharacterLength
propriété.la source
maintenant combien de caractères vous voulez juste donner des valeurs
la source
Utilisez ce code ici RESTRICTED_LENGTH est la longueur que vous souhaitez restreindre pour le champ de texte.
la source
J'ai fait cela dans Swift pour une limite de 8 caractères lors de l'utilisation d'un pavé numérique.
J'ai dû tester la chaîne! = "" Pour permettre au bouton de suppression de fonctionner sur le pavé numérique, sinon il ne permettrait pas de supprimer des caractères dans le champ de texte après avoir atteint son maximum.
la source
Pour Xamarin:
la source
J'ai implémenté une extension UITextField pour y ajouter une propriété maxLength.
Il est basé sur Xcode 6 IBInspectables, vous pouvez donc définir la limite maxLength sur le générateur d'interface.
Voici l'implémentation:
la source