Objective-C - Supprimer le dernier caractère de la chaîne

151

Dans Objective-C pour iOS, comment supprimer le dernier caractère d'une chaîne à l'aide d'une action de bouton?

Omar
la source

Réponses:

418

Dans votre classe de contrôleur, créez une méthode d'action à laquelle vous accrocherez le bouton dans Interface Builder. À l'intérieur de cette méthode, vous pouvez couper votre chaîne comme ceci:


if ([string length] > 0) {
    string = [string substringToIndex:[string length] - 1];
} else {
    //no characters to delete... attempting to do so will result in a crash
}






Si vous voulez une façon sophistiquée de le faire en une seule ligne de code, vous pouvez l'écrire comme suit:

string = [string substringToIndex:string.length-(string.length>0)];

* Explication de l'extrait de code fantaisie sur une ligne:

S'il y a un caractère à supprimer (c'est-à-dire que la longueur de la chaîne est supérieure à 0), le
     (string.length>0)retour 1 du code est renvoyé:
          string = [string substringToIndex:string.length-1];

S'il n'y a PAS de caractère à supprimer (c'est-à-dire la longueur du string n'est PAS supérieur à 0)
     (string.length>0)renvoie 0 donc le code retour:
          string = [string substringToIndex:string.length-0];
     ce qui évite les plantages.

Marc Charbonneau
la source
8
Votre solution a un bug off by 1. Il doit être [string substringToIndex: [string length] - 1];
Jim Correia le
"String" fait-il référence à "string.text" ou juste au nom de la chaîne
Omar
Merci Jim, il était trop tôt le matin pour l'arithmétique, je suppose. :) Omar, string fait référence à une variable appelée string qui contient le texte que vous souhaitez modifier. Vous pouvez consulter la documentation sur les différentes façons de créer un objet NSString, soit à partir d'un fichier sur disque, soit à partir de données dans votre application.
Marc Charbonneau
1
@DonalRafferty assurez-vous que votre chaîne n'est pas nulle
quantumpotato
Ce n'est pas grave si string est nul - appeler une méthode qui renvoie une valeur entière renverra 0 dans Obj-C (notez que ce n'est PAS vrai pour les valeurs de retour en virgule flottante). Donc, si la déclaration équivaut à demander string != nil && [string length] > 0. Il y a de fortes chances que la variable chaîne de Donal soit trop libérée.
Marc Charbonneau
53

S'il s'agit d'un NSMutableString (que je recommanderais car vous le modifiez dynamiquement), vous pouvez utiliser:

[myString deleteCharactersInRange:NSMakeRange([myRequestString length]-1, 1)];
Dave DeLong
la source
8

Les solutions données ici ne prennent pas en compte les caractères Unicode multi-octets («caractères composés»), et peuvent entraîner des chaînes Unicode invalides.

En fait, le fichier d'en-tête iOS qui contient la déclaration de substringToIndexcontient le commentaire suivant:

Astuce: à utiliser avec rangeOfComposedCharacterSequencesForRange: pour éviter de rompre les caractères composés

Découvrez comment utiliserrangeOfComposedCharacterSequenceAtIndex: pour supprimer correctement le dernier caractère.

utilisateur1071136
la source
6

La documentation est votre ami, NSStringprend en charge un appel substringWithRangequi peut raccourcir la chaîne que vous avez un retour de la chaîne raccourcie. Vous ne pouvez pas modifier une instance de NSStringcelui-ci est immuable. Si vous avez un NSMutableStringest a une méthode appelée deleteCharactersInRangequi peut modifier la chaîne en place

...
NSRange r;
r.location = 0;
r.size = [mutable length]-1;
NSString* shorted = [stringValue substringWithRange:r];
...
Harald Scheirich
la source
1
NSMakeRange peut parfois rendre le remplissage d'une structure de plage un peu plus élégant.
dreamlax
@Harald, substringWithRange:renvoie un NSString*. Prenez note du pointeur.
Thomas Nadin