执行以下操作时,我收到“格式不是字符串...”消息:
NSString* string1 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Update Now", @"Update Now Item")];
NSString* string2 = [[NSString alloc] initWithFormat:NSLocalizedString(@"Register", @"Register Now")];
它工作正常,即应用程序不会在设备或模拟器上崩溃,并且本地化文本也显示正常。
我试图理解为什么我收到这个特定的错误消息。据我所知,这就是你在Objective C中使用本地化字符串的方式。
答案 0 :(得分:6)
使用本地化字符串的最简单方法是:
NSString * myString = NSLocalizedString(@“更新 现在“,@”立即更新“);
现在记住myString是自动释放的 - 你通常需要一个字符串。
在示例中,您保留字符串(因为您使用initWithFormat)。猜测“立即更新”等将在用户UI中显示,可能通过UILabel显示您不需要保留字符串 - 当您将字符串分配给UILabel时,它将自动保留它(因为文本存储在保留的财产)
答案 1 :(得分:4)
NSLocalizedString是一个宏,实际上是;
[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
那么,为什么你需要另一个NSString除非你做一些像格式替换这样的后处理,否则它会返回一个NSString!
如果你愿意,你可以保留它......
答案 2 :(得分:1)
你根本不应该使用initWithFormat:
,因为你没有处理格式字符串。
但是如果你使用它,总是这样使用它:
[[NSString alloc] initWithFormat:@"%@", NSLocalizedString(@"Update Now", @"Update Now Item")];
否则,风险是NSLocalizedString
的结果包含字符串格式说明符(如%d
或其他内容),这会导致您的应用崩溃。
答案 3 :(得分:0)
编译器报告的警告是正确的。从NSLocalizedString(@"Update Now", @"Update Now Item")
返回的字符串不是格式字符串,因为它内部没有格式说明符。
正如Ican Zilb在另一个回答中所说,最好的解决方案是直接使用:
NSString* myString = NSLocalizedString(@"Update Now",@"Update Now Item");