我正在将我的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,并且将来不必记住为什么一个代码不是“现代”。
感谢。
答案 0 :(得分:3)
问题是barButtonFont
是nil
,(可能是因为您没有名为 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