8
votes

Ajout d'un suffixe de texte sans édition à un Uitextfield

J'ai un Uitextfield que j'aimerais ajouter un "?" suffixe à tout le texte entré.

L'utilisateur ne doit pas être capable de supprimer cela "?" ou ajouter du texte au côté droit de celui-ci.

Quelle est la meilleure façon d'y aller?


0 commentaires

9 Réponses :


2
votes

Vous aurez probablement besoin de sous-classe Uitextfield et de remplacer son Drawtext: méthode pour dessiner un "?" caractère à droite du texte actuel. (Plutôt que d'ajouter un "?" Au texte de la vue.


3 commentaires

J'aime cette solution plus que j'aime ma propre solution. +1 :-)


Jesse, comment dessinons-nous ce personnage?


@GabrielMolter avec n'importe laquelle des API normales de dessin d'Uikit String.



0
votes

Pour un fichier UITEXTX unique, vous devriez être capable de mesurer la taille de la nstring (il a une fonction de mesure là-bas, quelque part) et déplacez un Uilabel vers la bonne position.


0 commentaires

0
votes

J'ajouterais une méthode appelée lorsque Modifier les finitions:

`- (void)editDidFinish {
  NSString* str=[[NSString alloc] init];
  str=myEdit.text;
  [str stringByAppendingString:@"?"];
  myEdit.text=str;
}`


0 commentaires


1
votes

J'ai eu ce problème et j'ai écrit une sous-classe pour ajouter cette fonctionnalité: https://github.com/sbaumgarten/ Uiplaceholdersuffixfield . J'espère que vous avez trouvé une solution en maintenant, mais si vous ne le faites pas, cela devrait fonctionner.


0 commentaires

0
votes

OK, je suis définitivement trop tard, mais peut-être que je puisse aider quelqu'un de toute façon: Le moyen prévu d'accomplir cela consiste à utiliser un formidateur NSformatter personnalisé. Heres The Docs: https://developer.apple .com / bibliothèque / mac / de documentation / cacao / référence / fondation / classes / nsformatter_class / référence / référence / référence.html

L'idée de base est la suivante: vous créez une sous-classe de NSFormatter et la substitution au moins Deux méthodes de travailleur: xxx

Ceci produira la chaîne de dipsplay de la valeur stockée dans l'objet (c'est-à-dire ajouter vos questions ici) xxx

Ici, vous devez transformer la chaîne d'affichage en un objet que vous souhaitez stocker, c'est-à-dire supprimer les questions

Le formateur peut ensuite être utilisé pour convertir les données des objets stockés en chaînes. qui conviennent à la présentation à l'utilisateur. Le grand avantage est que vous pouvez utiliser des formateurs partout où votre chaîne apparaîtra dans l'interface utilisateur. Il ne se limite pas à certains éléments d'interface utilisateur comme la solution où vous remplissez-vous -Drawtext in uitextfield. C'est juste hella pratique.


1 commentaires

Il serait agréable de donner un exemple de travail au lieu de faire des indices quant à la manière dont cette théorie devrait être possible. Lors de l'ajout d'un suffixe non modifiable dans un Uitextfield, je ne vois pas vraiment comment cela pourrait fonctionner avec un formidateur NSForme



1
votes

Je me rends compte que cette réponse est en retard, mais j'ai trouvé la plupart d'entre elles ne fonctionnaient pas pour mon scénario. J'ai un uittxtfield que je veux simplement forcer à avoir un suffixe que l'utilisateur ne peut pas modifier. Cependant, je ne veux pas sous-classe UitextView, modifier comment il gère le dessin, etc. Je veux juste empêcher l'utilisateur de modifier le suffixe.

Premièrement, je m'assure que le suffixe est défini dans le champ de texte lorsque l'édition a lieu. Cela pourrait être fait de nombreux moyens en fonction de votre scénario. Pour le mien, je le voulais à partir du début, je définissais simplement la propriété Textfield's Text offield's Cotation égale au suffixe lorsque la vue charge et stocke la longueur du suffixe pour plus tard. Par exemple: p> xxx pré>

puis j'ai utilisé le uitextfieldelegate protocole comme Josh suggéré ci-dessus, mais utilisez la longueur de la chaîne et la plage pour vous assurer que rien ne modifie le suffixe: p>

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    // Determine starting location of the suffix in the current string
    int suffixLocation = textField.text.length - _suffixLength;

    // Do not allow replacing anything in/past the suffix
    if (range.location + range.length > suffixLocation)
    {
        return NO;
    }

    // Continue with delegate code...
}


0 commentaires

0
votes

Cette méthode de classe J'ai écrit dans Objective-C, vous aide à ajouter un texte suffixe à un uitextfield code>. Je commande de le faire fonctionner, vous devez initialiser le Uilabel CODE> au préfixe ou au suffixe de votre uitextfieldlabel code> comme suit: xxx pré>

une fois Nous avons le uilabel code> ci-joint au uitextfield code>, vous pouvez utiliser cette méthode de classe pour mettre à jour le texte, et ce texte sera redimensionné automatiquement pour s'adapter dans le champ. P >

+ (BOOL)UpdateUITextFieldSuffix:(UITextField*)textField withString:(NSString*)string
{
    BOOL returnUpdateSuffix = NO;
    if (string != nil && [string respondsToSelector:@selector(length)] && [string length] > 0)
    {
        NSObject *labelSuffix = textField.rightView;
        if (labelSuffix != nil && [labelSuffix respondsToSelector:@selector(setText:)])
        {
            [(UILabel*)labelSuffix setTextAlignment:NSTextAlignmentRight];
            [(UILabel*)labelSuffix setText:string];
            [(UILabel*)labelSuffix setBackgroundColor:[UIColor redColor]];
            {
                NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                                      ((UILabel*)labelSuffix).font, NSFontAttributeName,nil];
                CGRect frame = [((UILabel*)labelSuffix).text boundingRectWithSize:CGSizeMake(0.0f, CGFLOAT_MAX)
                                                                          options:NSStringDrawingUsesLineFragmentOrigin
                                                                       attributes:attributesDictionary
                                                                          context:nil];
                CGSize size = frame.size;
                CGRect newFrame = [(UILabel*)labelSuffix frame];
                newFrame.size.width = size.width;
                [(UILabel*)labelSuffix setFrame:newFrame];
                [(UILabel*)labelSuffix setNeedsLayout];
                [(UILabel*)labelSuffix layoutIfNeeded];
            }            
            returnUpdateSuffix = YES;
        }
    }    
    return returnUpdateSuffix;
}


0 commentaires

0
votes

J'ai écrit la méthode suivante pour atteindre la tâche ci-dessus de placer un suffixe non modifiable à UITEXTFIELD:

    - (void)setSuffixText:(NSString *)suffix
    {
      UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
    [label setBackgroundColor:[UIColor clearColor]];
    [label setFont:[UIFont fontWithName:self.tfdDistance.font.fontName size:self.tfdDistance.font.pointSize]];
    [label setTextColor:self.tfdDistance.textColor];
    [label setAlpha:.5];
    [label setText:suffix];

    CGSize suffixSize = [suffix sizeWithFont:label.font];
    label.frame = CGRectMake(0, 0, suffixSize.width, self.tfdDistance.frame.size.height);

    [self.tfdDistance setRightView:label];
    [self.tfdDistance setRightViewMode:UITextFieldViewModeAlways];
}​


0 commentaires