覆盖UIFonts时__NSPlaceholderDictionary崩溃

时间:2016-05-27 14:15:05

标签: ios objective-c nsdictionary uifont

我使用以下代码覆盖了我的应用中的所有字体。我需要花费数小时来解决这个问题,但是如果字体被覆盖,则正常功能会中断(例如:UITableViewCell上的长按手势),并且所有UIBarButtonItem截断的实例仅显示...在导航栏中。

崩溃总是导致

  

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

//.h 
@interface UIFont (SystemFontOverride)
@end

//.m 
@implementation UIFont (SystemFontOverride)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize {
    return [UIFont fontWithName:@"HelveticaNeue-Regular" size:fontSize];
}

+ (UIFont *)systemFontOfSize:(CGFloat)fontSize {
    return [UIFont fontWithName:@"HelveticaNeue-Thin" size:fontSize];
}

+ (UIFont *)italicSystemFontOfSize:(CGFloat)fontSize {
    return [UIFont fontWithName:@"HelveticaNeue-ThinItalic" size:fontSize];
}
#pragma clang diagnostic pop

@end
我做错了什么?是否有更好的方法来覆盖字体而无需手动设置每个标签,段控制等...这个应用程序不会在应用程序商店,所以我打开任何建议。

红利问题,#pragma clang diagnostic pop#pragma clang diagnostic push。我理解它保存编译器的状态,静音警告,然后恢复状态。我可以逃脱#pragma clang diagnostic ignored吗?

2 个答案:

答案 0 :(得分:0)

您也可以将UILabel子类化并在任何地方使用它:

例如,在init方法中调用setFont,

然后只需找到并替换UILabel和您的子类

答案 1 :(得分:0)

为了将此标记为已回答,我正在关注rmaddy的评论

  

不要尝试替换类别中的标准UIFont方法,而是将自己的方法添加到类别中。示例 - 而不是覆盖boldSystemFontOfSize:,将其命名为myBoldSystemFontOfSize:。或者使用UI_APPEARANCE或使用label.font = [label.font fontWithSize:newSize]更改标签的字体大小;

我走了UI_APPEARANCE路线

[[UILabel appearance] setFont:[UIFont fontWithName:fontName size:fontSize]];

如果您的标签需要不同的字体大小,这可能会有问题,幸运的是,我需要更改的标签都是相同的字体大小