NSLocalizedString - Форматировать не строковый литерал и не форматировать аргументы (xcode) - PullRequest
3 голосов
/ 26 апреля 2011

Я получаю сообщение «format not a string ...» при выполнении следующих действий:

NSString* string1 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Update Now", @"Update Now Item")];
NSString* string2 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Register", @"Register Now")];

Работает нормально, т. Е. Приложение не падает на устройстве или симуляторе, а локализованный текст также отлично отображается.

Я пытаюсь понять, почему тогда я получаю это конкретное сообщение об ошибке. Насколько я знаю, именно так вы должны использовать локализованные строки в Objective C.

Ответы [ 4 ]

6 голосов
/ 26 апреля 2011

Простейший способ использовать локализованную строку:

NSString * myString = NSLocalizedString (@ "Обновить сейчас", @ "Обновить сейчас");

Сохранить сейчаспомните, что myString автоматически высвобождается, что обычно требуется для строки.

В приведенных вами примерах строки сохраняются (поскольку вы используете initWithFormat).Гадание «обновить сейчас» и тому подобное будет показано в пользовательском интерфейсе пользователя, возможно, через UILabel вам не понадобится сохраненная строка - когда вы назначаете строку для UILabel, она автоматически сохраняет ее (так как текст сохраняетсяв оставшейся собственности)

4 голосов
/ 26 апреля 2011

NSLocalizedString - это макрос, который на самом деле;

[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]

Итак, с какой стати вам нужна еще одна строка NSString, если только вы не выполните некоторую постобработку, например, замену формата, он все равно возвращает строку NSString!

Вы можете сохранить его, если хотите ...

1 голос
/ 26 апреля 2011

Вам вообще не следует использовать initWithFormat:, потому что вы не имеете дело со строкой формата.

Но если вы используете ее, всегда используйте ее так:

[[NSString alloc] initWithFormat:@"%@", NSLocalizedString(@"Update Now", @"Update Now Item")];

В противном случае риск состоит в том, что результат NSLocalizedString содержит спецификатор формата строки (например, %d или что-то в этом роде), что может привести к сбою приложения.

0 голосов
/ 29 апреля 2011

Предупреждение, сообщенное компилятором, является правильным. Строка, возвращаемая из NSLocalizedString(@"Update Now", @"Update Now Item") , не является строкой формата , поскольку внутри нее нет спецификатора формата.

Как сказал Икан Зильб в другом ответе, лучшим решением будет использование:

NSString* myString = NSLocalizedString(@"Update Now",@"Update Now Item");
...