__NSPlaceholderDictionary 覆盖 UIFonts 时崩溃

__NSPlaceholderDictionary crash when overriding UIFonts

我正在使用以下代码覆盖我的应用程序中的所有字体。我花了好几个小时才弄明白,但随着字体被覆盖,正常功能会中断(例如:UITableViewCell 上的长按手势),并且 UIBarButtonItem 的所有实例都被截断,仅显示 ...在导航栏中。

崩溃总是导致

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '* -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[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 吗?

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

例如在init方法中调用setFont,

然后简单地用您的子类查找并替换 UILabel

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

Instead of trying to replace the standard UIFont methods in a category, add your own methods to the category. Example - instead of overriding boldSystemFontOfSize:, name it myBoldSystemFontOfSize:. Or use UI_APPEARANCE or change a label's font size using label.font = [label.font fontWithSize:newSize];

我走了 UI_APPEARANCE 路线

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

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