与setTitleTextAttributes一起使用时导致崩溃的NSDictionary文字

时间:2013-04-19 02:02:17

标签: objective-c literals

我正在将我的xcode项目转换为现代目标c。在我的AppDelegate中,我之前有这段代码:

- (void)customizeAppearance
{
    [[UIBarButtonItem appearance] setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:barButtonFont, UITextAttributeFont, nil] forState:UIControlStateNormal];
}

以下,使用@ {keys:value}创建NSDictionary的字面方法,我将其更改为:

[[UIBarButtonItem appearance] setTitleTextAttributes:@{UITextAttributeFont: barButtonFont} forState:UIControlStateNormal];

这一次更改导致我的系统崩溃。错误输出是:

  

*由于未捕获的异常'NSInvalidArgumentException'而终止应用,原因:'* - [__ NSPlaceholderDictionary   initWithObjects:forKeys:count:]:尝试从中插入nil对象   对象[0]'

有谁知道为什么以及我能做些什么来修复它?

我可以忽略它但后来它会咬我,因为我会忘记。我确实希望将整个项目改为现代目标c,并且将来不必记住为什么一个代码不是“现代”。

感谢。

2 个答案:

答案 0 :(得分:3)

问题是barButtonFontnil,(可能是因为您没有名为 Helvetica CE 的字体)。只有在移动到文字语法时才会出现此问题,因为“密钥和值都不能在容器中具有值nil。如果编译器在编译时可以证明键或值为nil,则会发出警告。否则,将发生运行时错误。“

此处有更多详细信息:http://clang.llvm.org/docs/ObjectiveCLiterals.html

答案 1 :(得分:2)

要设置属性,需要为两种状态设置它。

试试这段代码:

 NSDictionary* textAttributes = [NSDictionary dictionaryWithObject: [UIFont fontWithName:@"Helvetica" size:45.0] forKey: UITextAttributeFont];

[[UIBarButtonItem appearance] setTitleTextAttributes: textAttributes
                                            forState: UIControlStateDisabled];

[[UIBarButtonItem appearance] setTitleTextAttributes: textAttributes
                                            forState: UIControlStateNormal];

在Appdelegate中实现此功能

有关详细信息,您也可以参考此答案。

UIBarButtonItem appearance setTitleTextAttributes does not affects UIControlStateDisabled state