【问题标题】:NSLocalizedString - Format not a string literal and no format arguments (xcode)NSLocalizedString - 格式不是字符串文字,也没有格式参数(xcode)
【发布时间】:2011-08-12 13:38:00
【问题描述】:

执行以下操作时,我收到“格式不是字符串...”消息:

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

它工作正常,即应用程序不会在设备或模拟器上崩溃,并且本地化文本也可以正常显示。

我试图理解为什么我会收到这个特定的错误消息。据我所知,这就是您在 Objective C 中使用本地化字符串的方式。

【问题讨论】:

    标签: iphone ios objective-c xcode4 foundation


    【解决方案1】:

    你根本不应该在这里使用initWithFormat:,因为你不是在处理格式字符串。

    但如果你使用它,总是这样使用它:

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

    否则,风险在于NSLocalizedString 的结果包含字符串格式说明符(如%d 或其他内容),这会导致您的应用崩溃。

    【讨论】:

    • +1。使用initWithString: 代替initWithFormat: 也可以。
    • 或者你可以只使用[[NSString alloc] initWithString:NSLocalizedString(@"Update Now", @"Update Now")]; 如果你实际上是在传递一个格式字符串,你应该只使用-initWithFormat:
    • 不,他不应该。在这种情况下,他根本不应该使用initWithFormat:
    【解决方案2】:

    使用本地化字符串的最简单方法是:

    NSString* myString = NSLocalizedString(@"更新 现在",@"立即更新");

    现在请记住,myString 是自动释放的 - 您通常需要一个字符串。

    在您提供的示例中,您的字符串被保留(因为您使用了 initWithFormat)。猜测“立即更新”等将显示在用户 UI 中,可能通过 UILabel 您不需要保留的字符串 - 当您将字符串分配给 UILabel 时,它将自动保留它(因为文本已存储在保留的财产中)

    【讨论】:

      【解决方案3】:

      NSLocalizedString 是一个宏,其实就是;

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

      那么,你到底为什么需要另一个 NSString,除非你做一些像格式替换这样的后处理,它无论如何都会返回一个 NSString!

      如果你喜欢,你可以保留它......

      【讨论】:

        【解决方案4】:

        编译器报告的警告是正确的。从NSLocalizedString(@"Update Now", @"Update Now Item") 返回的字符串不是格式字符串,因为它里面没有格式说明符。

        正如 Ican Zilb 在另一个答案中所说,最好的解决方案是直接使用:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-13
          • 2011-05-24
          • 2014-12-23
          • 1970-01-01
          • 2015-01-27
          • 1970-01-01
          • 2013-06-20
          • 2013-08-25
          相关资源
          最近更新 更多