Est-il possible de définir une propriété dans Interface-Builder et de lire cette propriété dans le code?

J'ai trois UITextField que je veux limiter en longueur. Le premier et deuxième champ de texte à 24 caractères et le troisième champ de texte à 32 caractères.

J'ai trouvé cette solution pour limiter les caractères dans un UITextField qui fonctionne très bien:

#define MAXLENGTH 10

- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSUInteger oldLength = [textField.text length];
    NSUInteger replacementLength = [string length];
    NSUInteger rangeLength = range.length;

    NSUInteger newLength = oldLength - rangeLength + replacementLength;

    BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;

    return newLength <= MAXLENGTH || returnKey;
}

Mais cette solution suggère que chaque champ de texte est limité à la même longueur (c'est-à-dire 10 caractères tels que définis en haut de l'extrait de code). Je me demandais s'il y avait une chance de définir une sorte de propriété pour chacun de mes champs de texte séparément dans l'Interface-Builder de XCode qui me permet de lire dans le code - de sorte que je puisse remplacer "MAXLENGTH" par quelque chose comme "[textField valueForKey: @" maxLength "]" où "maxLength" serait défini visuellement dans le XCode Interface-Builder ...

Des idées?

0
Malgré ce que dit la réponse ci-dessous, il est en fait possible de définir la longueur maximale dans Interface Builder en utilisant le champ d'étiquette de chaque vue de texte. Les vues peuvent être chargées par une balise (qui ne fonctionnerait pas dans ce cas si plusieurs ont la même valeur d'étiquette) ou leur valeur d'étiquette associée peut être interrogée si elle est restaurée par d'autres moyens. Cependant, le champ d'étiquette est destiné à identifier les vues de ne pas stocker les données associées pour eux. Mais en utilisant des balises, il est possible de les utiliser pour stocker
ajouté l'auteur Gruntcakes, source
@ luk2302 et Gruntcakes: Merci beaucoup pour vos réponses rapides! Je vais penser à mal utiliser la propriété de l'étiquette. Mais je sais déjà que lorsque je reprendrai mon projet deux mois plus tard, je ne me souviendrai plus de ce bidouillage ;-p
ajouté l'auteur salocinx, source
Vous pouvez sous-classer le champ de texte, ajouter une valeur IBInspectable représentant la longueur maximale, puis affecter votre classe personnalisée en tant que champ de texte dans IB.
ajouté l'auteur luk2302, source
Et une idée assez désordonnée: D utiliser l'étiquette du champ de texte comme longueur maximale, par exemple utiliser l'étiquette 9015 comme longueur max 15, et 9030 comme 30, etc ...;)
ajouté l'auteur luk2302, source

1 Réponses

Il n'y a aucun moyen de définir la longueur maximale pour chaque champ de texte via Interface Builder, mais il existe une solution simple dans votre code.

Au lieu d'utiliser un #define pour la longueur maximale, calculez la longueur maximale en fonction du paramètre textField .

Disons que vous avez trois points de vente pour vos champs de texte nommés champ1 , champ2 , et champ3 . Ensuite, vous pouvez faire quelque chose comme ça:

- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger maxLength = 24;//for field1 and field2
    if (textField == self.field3) {
        maxLength = 32;
    }

   //and now the rest of the processing
}
0
ajouté
merci beaucoup pour votre aide - probablement je vais aller de cette façon. le code peut paraître pire, mais je me souviendrai au moins comment ça marche quand je le regarde deux mois plus tard ;-)
ajouté l'auteur salocinx, source