2013-01-17 11 views
7

kullanılması ancak Use of undeclared identifier 'NSLocalizedString' ve Too many arguments provided to function-like macro invocation ile başarısız ayarlandı. Değişkeni kullanarak çalışma kodum var, bu iyi bir şey, sadece diğer durumlarda nasıl önleneceğini bilmeme nedenlerini anlamak istiyorum. Aşağıdaki bildirimleri ileNSLocalizedString - İkinci parametre değişkeni olarak aynı yazılır eğer ikinci parametre bir değişken olarak aktarılırsa çalışıyor, belirli bir mesajda <code>NSLocalizedString</code> kullanıyorum bildirilmemiş tanımlayıcı sorunu

:

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

Bu hatasız çalışıyor:

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

... ama bana aynı görünüyor bu, yukarıda belirtilen hatalara başarısız:

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

Burada ve başka yerde arama Bir açıklama bulamadım. Her hata iletisinde ve çeşitli NSLocalizedString sorunlarında bir dizi isabet okudum, ancak bunları birbirine bağlayan hiçbir şey yok. İkinci hata mesajıyla ilgili bulduğum şey, ekstrenizde NSMutableString mesajının içinde olsa bile, NSLocalizedString tarafından ek bir parametre olarak görüldüğünü belirterek, clang ve ifade içindeki virgüllerin sayısı ile ilgili bir sorun olabilir. Bu bir anlam ifade ediyor mu?

Soru için önemli değil, ancak bu ifadenin, farklı görünümler için farklılık gösteren bir sözlükten çekilen İngilizce sürümüne göre bir gezinti çubuğu başlığının yerelleştirilmiş sürümünü ayarlaması amaçlanmıştır. NSMutableString bölümü, İngilizce başlığa dayalı yerelleştirmeyle ilgili yorumu tanımlar.

DÜZENLEME: Bu sorunu kabul edilen yanıt başına çözümledikten sonra, aşağıdan bir başka sorunla karşılaştım. localString bildirimi, açıkça kullanılmasına rağmen "Unused variable" derleyici uyarısı üretiyordu. Bu aynı zamanda bir C-makrosu içinde olması ve tamlığı nedeniyle, bu uyarıyı bastırmak için ilgili bir gönderiye bağlantı ekliyorum: How can I get rid of an “unused variable” warning in Xcode

cevap

14

Bunun kötü bir C-makro genişletme sonucu olduğuna inanıyorum. Aslında, eğer yazıyorsanız:

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

bunu derler.

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

PS: Ben yazdığımda Nedense, önişlemci iyi (Objective-C çağrıları hakkında bilmiyor muhtemelen çünkü) ve ayrı argümanlar olarak [] içinde tüm unsurları davranır [] içindeki metni işleyen değil

makro genişleme pis köşe durumlarda ve oldukça ince şekilde yanlış önişlemcisinin genişleme algoritmasını optimize etmek için şık bir yol olduğunu düşündüğüm hale durumlarla dolu zor bir operasyon şöyledir: kötü C- makro genişleme, ben this demek .

+2

Güzel, yalnızca bir dizi parantez eklemek bunu düzeltir. NSLocalizedString, Objective-C içinde bilerek kullanmış olduğum ilk C-makrosudur, bu yüzden başkaları etrafta dolanırken akılda tutulması gereken iyi bir ipucu. Teşekkürler! –

+0

yardım etmekten memnun oldum! – sergio

İlgili konular