J'essaie d'utiliser stringWithFormat pour définir une valeur numérique sur la propriété text d'une étiquette, mais le code suivant ne fonctionne pas. Je ne peux pas lancer l'int sur NSString. Je m'attendais à ce que la méthode sache comment convertir automatiquement un int en NSString.
Que dois-je faire ici?
- (IBAction) increment: (id) sender
{
int count = 1;
label.text = [NSString stringWithFormat:@"%@", count];
}
Faire ceci:
label.text = [NSString stringWithFormat:@"%d", count];
Gardez à l'esprit que @ "% d" ne fonctionnera que sur 32 bits. Une fois que vous commencez à utiliser NSInteger pour des raisons de compatibilité, si vous compilez pour une plate-forme 64 bits, vous devez utiliser @ "% ld" comme spécificateur de format.
Marc Charbonneau a écrit:
Gardez à l'esprit que @ "% d" ne fonctionnera que sur 32 bits. Une fois que vous commencez à utiliser NSInteger pour des raisons de compatibilité, si vous compilez pour une plate-forme 64 bits, vous devez utiliser @ "% ld" comme spécificateur de format.
Intéressant, merci pour le conseil, j'utilisais @ "% d" avec mes NSInteger
s!
La documentation du SDK recommande également de transtyper NSInteger
en long
dans ce cas (pour correspondre au @ "% ld"), par exemple:
NSInteger i = 42;
label.text = [NSString stringWithFormat:@"%ld", (long)i];
Source: Guide de programmation de chaînes pour Cocoa - Spécificateurs de format de chaîne (Nécessite l'enregistrement d'un développeur iPhone)
Vous voulez utiliser %d
ou %i
pour les entiers. %@
est utilisé pour les objets.
Il convient toutefois de noter que le code suivant accomplira la même tâche et est beaucoup plus clair.
label.intValue = count;
Et pour la valeur comique:
label.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:count]];
(Bien que cela puisse être utile si vous avez un jour affaire à NSNumber)
Pour être sûrs en 32 et 64 bits, utilisez l’une des expressions Boxed Expressions :
label.text = [NSString stringWithFormat:@"%@", @(count).stringValue];
L'extrait que vous avez posté est-il juste un exemple montrant ce que vous essayez de faire?
La raison pour laquelle je vous pose la question est que vous avez nommé une méthode increment
, mais vous semblez l’utiliser pour définir la valeur d’une étiquette de texte plutôt que d’incrémenter une valeur.
Si vous essayez de faire quelque chose de plus compliqué - comme définir une valeur entière et que l'étiquette affiche cette valeur, vous pouvez envisager d'utiliser des liaisons. par exemple
Vous déclarez une propriété count
et votre action increment
définit cette valeur sur n'importe quoi, puis dans IB, vous liez le texte du libellé à la valeur count
. Tant que vous suivez le code de valeur de clé (KVC) avec count
, vous n'avez pas besoin d'écrire de code pour mettre à jour l'affichage de l'étiquette. Et du point de vue de la conception, vous avez un couplage plus lâche.
N'oubliez pas pour long long int
:
long long int id = [obj.id longLongValue];
[NSString stringWithFormat:@"this is my id: %lld", id]
label.text = [NSString stringWithFormat:@"%d", XYZ];
//result: label.text = XYZ
//use %d for int values
NSString * formattedname;
NSString * firstname;
NSString * middlename;
NSString * lastname;
firstname = @"My First Name";
middlename = @"My Middle Name";
lastname = @"My Last Name";
formattedname = [NSString stringWithFormat:@"My Full Name: %@ %@ %@", firstname, middlename, lastname];
NSLog(@"\n\nHere is the Formatted Name:\n%@\n\n", formattedname);
/*
Result:
Here is the Formatted Name:
My Full Name: My First Name My Middle Name My Last Name
*/