1

我正在将我的 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:]: 尝试从对象 [0] 插入 nil 对象”

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

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

谢谢。

4

2 回答 2

3

问题是barButtonFontnil(可能是因为您没有可用的名为Helvetica CE的字体)。这个问题只有在你转向文字语法时才会暴露出来,因为“在容器中键和值都不能有值 nil。如果编译器可以在编译时证明键或值是 nil,那么将发出警告。否则,将发生运行时错误。”

这里有更多细节:http: //clang.llvm.org/docs/ObjectiveCLiterals.html

于 2013-04-19T06:31:45.627 回答
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 外观 setTitleTextAttributes 不影响 UIControlStateDisabled 状态

于 2013-04-19T06:47:47.803 回答