2013-01-17 15 views
7

sto usando NSLocalizedString in un particolare messaggio che funziona bene se il secondo parametro viene passato come una variabile, ma non riesce con Use of undeclared identifier 'NSLocalizedString' e Too many arguments provided to function-like macro invocation se il secondo parametro è scritto esattamente come la variabile era stabilito. Ho un codice funzionante usando la variabile, che va bene, voglio solo capire i motivi per cui non so come evitarlo in altre situazioni.NSLocalizedString - Utilizzo di non dichiarato questione identificatore

Con le seguenti dichiarazioni:

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

Questo funziona bene senza gli errori:

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

... ma questo, che sembra identico a me, non riesce con gli errori sopra indicati:

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

Cercare qui e altrove Non ho trovato una spiegazione. Ho letto un numero di accessi su ogni messaggio di errore e vari problemi NSLocalizedString, ma nulla che li legasse insieme. Quello che ho trovato sul secondo messaggio di errore implicava forse un problema con clang e il numero di virgole nella dichiarazione, che indicava che anche se la virgola extra era all'interno del messaggio NSMutableString, veniva ancora vista come un parametro aggiuntivo entro il NSLocalizedString. Ha senso?

Non importante per la domanda, ma l'istruzione è intesa per impostare la versione localizzata di un titolo della barra di navigazione in base alla versione inglese estratta da un dizionario, che varia a seconda delle viste. La parte NSMutableString definisce il commento per la localizzazione in base al titolo inglese.

MODIFICA: dopo aver risolto questo problema per la risposta accettata, di seguito, ho notato un altro problema correlato. La dichiarazione di localString stava producendo un avviso del compilatore "Unused variable", sebbene fosse chiaramente utilizzato. Ciò è dovuto anche al fatto che si trova all'interno di una macro C e per completezza, sto aggiungendo un collegamento a un post pertinente qui sulla soppressione di tale avviso: How can I get rid of an “unused variable” warning in Xcode

risposta

14

Credo che questo sia il risultato di una cattiva espansione della C-macro. Infatti, se si scrive:

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

questo verrà compilato. Per qualche ragione, il preprocessore non gestisce bene il testo all'interno [] (forse perché non sa di chiamate Objective-C) e tratta tutti gli elementi all'interno [] come argomenti separati:

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

PS: Quando ho scritto Bad espansione C-macro, volevo dire this:

macro di espansione è un'operazione difficile, irto di casi d'angolo brutto e situazioni che rendono quello che si pensava fosse un modo ingegnoso per ottimizzare l'algoritmo di espansione del preprocessore sbagliato in maniera piuttosto sottili .

+2

Bello, basta aggiungere un set di parentesi per risolverlo. NSLocalizedString è la prima macro C che ho usato consapevolmente all'interno di Objective-C, quindi è un buon consiglio da tenere a mente quando gli altri girano intorno. Grazie! –

+0

felice di aver aiutato! – sergio

Problemi correlati