2008-12-21 8 views
61

Próbuję użyć stringWithFormat, aby ustawić wartość liczbową we właściwości tekstowej etykiety, ale poniższy kod nie działa. Nie mogę rzucić int do NSString. Spodziewałem się, że metoda będzie wiedzieć, jak automatycznie przekonwertować int na NSString.Jak powinienem przekazać int do stringWithFormat?

Co muszę tu zrobić?

- (IBAction) increment: (id) sender 
{ 
    int count = 1; 
    label.text = [NSString stringWithFormat:@"%@", count]; 
} 

Odpowiedz

122

Wykonaj:

label.text = [NSString stringWithFormat:@"%d", count]; 
+8

To daje ostrzeżenie podczas kompilacji dla urządzeń 64-bitowych, gdzie 'int' jest w rzeczywistości' długim '. – devios1

24

Chcesz użyć %d lub %i dla liczb całkowitych. %@ służy do obiektów.

Warto jednak zauważyć, że poniższy kod wykona to samo zadanie i będzie znacznie wyraźniejszy.

label.intValue = count; 
45

Należy pamiętać, że @ "% d" działa tylko w wersji 32-bitowej. Gdy zaczniesz używać NSIntegera do kompatybilności, jeśli kiedykolwiek skompilujesz platformę 64-bitową, powinieneś użyć @ "% ld" jako specyfikatora formatu.

+1

Użycie '% ld' podczas kompilowania dla urządzenia 32-bitowego generuje teraz ostrzeżenie. Która droga jest bezpieczniejsza? Używając '% ld' z 32 bitami lub używając'% d' z 64? – devios1

+1

Nieważne Widzę notatkę squelta o pierwszym rzuceniu na 'long'. To działa, a teraz kompiluje dla każdego celu bez ostrzeżenia! – devios1

13

A dla wartości komediowych:

label.text = [NSString stringWithFormat:@"%@", [NSNumber numberWithInt:count]]; 

(Choć może to być przydatne jeśli jeden dzień masz do czynienia z NSNumber'S)

+3

Lub użyj nowoczesnej składni celu-c i użyj: [NSString stringWithFormat: @ "% @", @ (count)] –

37

Marc Charbonneau napisał:

Należy pamiętać, że @ "% d" działa tylko na 32 bitach. Gdy zaczniesz używać NSIntegera do kompatybilności, jeśli kiedykolwiek skompilujesz platformę 64-bitową, powinieneś użyć @ "% ld" jako specyfikatora formatu.

Ciekawe, dzięki za cynk, użyłem @ "% d" z moimi NSInteger s!

Dokumentacja SDK zaleca również, aby rzucić NSInteger do long w tym przypadku (aby dopasować @ "% ld"), np:

NSInteger i = 42; 
label.text = [NSString stringWithFormat:@"%ld", (long)i]; 

Źródło: String Programming Guide for Cocoa - String Format Specifiers (wymaga rejestracji programisty iPhone)

1

Czy opublikowany fragment jest tylko próbką, aby pokazać, co próbujesz zrobić?

Powód, dla którego pytam, to nazwa metody increment, ale wydaje się, że używasz jej do ustawienia wartości etykiety tekstowej zamiast zwiększania wartości.

Jeśli próbujesz zrobić coś bardziej skomplikowanego - np. Ustawiając wartość całkowitą i mając etykietę wyświetlającą tę wartość, możesz rozważyć użycie powiązań. np.

Deklarujesz właściwość count, a twoja akcja increment ustawia tę wartość na dowolną, a następnie w IB wiążemy tekst etykiety do wartości count. Jeśli podążasz za kluczowym kodowaniem wartości (KVC) z count, nie musisz pisać żadnego kodu, aby zaktualizować wyświetlacz etykiety. A z punktu widzenia projektowania masz luźniejsze sprzężenie.

1

Nie zapomnij o long long int:

long long int id = [obj.id longLongValue]; 
[NSString stringWithFormat:@"this is my id: %lld", id] 
0
label.text = [NSString stringWithFormat:@"%d", XYZ]; 

//result: label.text = XYZ 
//use %d for int values 
4

Aby być 32-bitowe i 64-bitowe bezpieczny, użyj jednego z Boxed Expressions:

label.text = [NSString stringWithFormat:@"%@", @(count).stringValue]; 
0
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 
*/ 
Powiązane problemy