#iphone #ios #objective-c #xcode4 #foundation
#iPhone #iOS #objective-c #xcode4 #основа
Вопрос:
Я получаю сообщение «форматировать не строку …» при выполнении следующего:
NSString* string1 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Update Now", @"Update Now Item")];
NSString* string2 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Register", @"Register Now")];
Это работает нормально, т. е. приложение не вылетает на устройстве или симуляторе, и локализованный текст также отображается просто отлично.
Я пытаюсь понять, почему тогда я получаю это конкретное сообщение об ошибке. Насколько я знаю, именно так вы должны использовать локализованные строки в Objective C.
Ответ №1:
Самый простой способ использовать локализованную строку — это:
NSString* myString = NSLocalizedString(@»Обновить сейчас»,@»Обновить сейчас»);
Теперь имейте в виду, что myString автоматически освобождается, что обычно требуется для строки.
В приведенных вами примерах ваши строки сохранены (потому что вы используете initWithFormat). Предполагаю, что «обновить сейчас» и тому подобное будет показано в пользовательском интерфейсе, возможно, через UILabel вам не нужна сохраненная строка — когда вы назначаете строку UILabel, она сохранится автоматически (поскольку текст хранится в сохраненном свойстве)
Ответ №2:
NSLocalizedString — это макрос, который на самом деле;
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
Итак, с какой стати вам нужна другая NSString, если вы не выполняете некоторую постобработку, такую как замена формата, она все равно возвращает NSString!
вы можете сохранить его, если хотите…
Ответ №3:
Здесь вообще не следует использовать initWithFormat:
, потому что вы имеете дело не со строкой формата.
Но если вы используете его, всегда используйте его следующим образом:
[[NSString alloc] initWithFormat:@"%@", NSLocalizedString(@"Update Now", @"Update Now Item")];
В противном случае существует риск того, что результат NSLocalizedString
содержит спецификатор формата строки (например, %d
или что-то в этом роде), и это приведет к сбою вашего приложения.
Комментарии:
1. 1. Использование
initWithString:
вместоinitWithFormat:
тоже будет работать.2. Или вы можете просто использовать,
[[NSString alloc] initWithString:NSLocalizedString(@"Update Now", @"Update Now")];
вы должны использовать только-initWithFormat:
, если вы на самом деле передаете строку формата.3. Нет, он не должен. В этом случае он вообще не должен использовать
initWithFormat:
.
Ответ №4:
Предупреждение, выданное компилятором, является правильным. Строка, возвращаемая из NSLocalizedString(@"Update Now", @"Update Now Item")
, не является строкой формата, поскольку внутри нее нет спецификатора формата.
Как сказал Ican Zilb в другом ответе, лучшим решением является прямое использование:
NSString* myString = NSLocalizedString(@"Update Now",@"Update Now Item");