2013-01-17 13 views
7

używam NSLocalizedString w konkretnym komunikatem, który działa dobrze, jeśli drugi parametr jest przekazywana jako zmienna, ale nie z Use of undeclared identifier 'NSLocalizedString' i Too many arguments provided to function-like macro invocation Jeśli drugi parametr jest napisane dokładnie taka sama jak zmiennej było ustawione. Mam działający kod przy użyciu zmiennej, co jest w porządku, chcę po prostu zrozumieć powody nieumiejętności uniknięcia tego w innych sytuacjach.NSLocalizedString - Wykorzystanie nierejestrowanej identyfikatora emisji

z następujących deklaracji:

NSString *branchTitle = [branchDictionary objectForKey:@"Title"]; 
NSString *localString = [NSMutableString stringWithFormat:@"%@ node title", branchTitle]; 

Działa to dobrze, bez błędów:

[navItem setTitle:NSLocalizedString(branchTitle, localString)]; 

... ale to, co wydaje się identyczny do mnie, nie z błędów wymienionych powyżej:

[navItem setTitle:NSLocalizedString(branchTitle, [NSMutableString stringWithFormat:@"%@ node title", branchTitle])]; 

Wyszukiwanie tutaj i gdzie indziej Nie znalazłem wyjaśnienia. Przeczytałem kilka trafień w każdym komunikacie o błędzie i różnych problemach z NSLocalizedString, ale nic, co wiązało je ze sobą. To, co znalazłem w drugim komunikacie o błędzie, mogło być spowodowane problemem z klangiem i liczbą przecinków w komunikacie, co oznacza, że ​​mimo że dodatkowy przecinek znajduje się w komunikacie NSMutableString, nadal był postrzegany jako dodatkowy parametr przez NSLocalizedString. Czy to ma jakiś sens?

Nie ma znaczenia dla pytania, ale oświadczenie ma na celu ustawienie zlokalizowanej wersji tytułu paska nawigacji na podstawie wersji angielskiej wyciągniętej ze słownika, który różni się dla różnych widoków. Część NSMutableString definiuje komentarz do lokalizacji na podstawie tytułu angielskiego.

EDYCJA: Po rozwiązaniu tego problemu na podstawie zaakceptowanej odpowiedzi poniżej zauważyłem inny powiązany problem. Deklaracja z localString wygenerowała ostrzeżenie kompilatora "Unused variable", chociaż wyraźnie było używane. Jest to również spowodowane tym, że jest w makrze C i dla kompletności, dodaję link do odpowiedniego postu tutaj o tłumieniu tego ostrzeżenia: How can I get rid of an “unused variable” warning in Xcode

Odpowiedz

14

Wierzę, że jest to wynikiem złego rozszerzenia makra C. Rzeczywiście, jeśli napiszesz:

NSLocalizedString(branchTitle, ([NSString stringWithFormat:@"%@ node title", branchTitle])); 

to się skompiluje. Z jakiegoś powodu, preprocesor nie jest obsługa również tekst w [] (prawdopodobnie dlatego, że nie wie o połączeniach Objective-C) i traktuje wszystkie elementy wewnątrz [] jako osobne argumenty

#define NSLocalizedString(key, comment) \ 
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

PS: Kiedy pisałem złe C-makro ekspansja, chciałem this:

makro ekspansji jest skomplikowana operacja, obarczona nieprzyjemnych przypadków i sytuacji, które powodują, że to, co wydawało ci się fajny sposób, aby zoptymalizować algorytm ekspansji preprocesora jest złego w bardzo subtelny sposób narożnych .

+2

Przyjemnie, samo dodanie zestawu nawiasów naprawia to. NSLocalizedString to pierwsze makro C, które świadomie używałem w Objective-C, więc jest to dobra wskazówka, o której należy pamiętać, gdy inni się kręcą. Dzięki! –

+0

cieszę się, że pomogłem! – sergio