UILabel
フォント プロパティが変更されたときに余分な作業を行うカテゴリを作成しました。
サブクラスよりもカテゴリを選択したので、すべての XIB ファイルのすべてのラベルのクラスを変更する必要はありません。このカテゴリ宣言をプレフィックス ヘッダーに追加するだけで、カテゴリはプロジェクト スコープ全体で表示されます。
実装ファイル:
//
// UILabel+XIBCustomFonts.m
#import "UILabel+XIBCustomFonts.h"
@implementation UILabel (XIBCustomFonts)
BOOL comes_from_nib = NO;
-(id)initWithCoder:(NSCoder *)aDecoder_{
self = [super initWithCoder:aDecoder_];
if (self) {
comes_from_nib = YES;
}
return self;
}
-(void)setFont:(UIFont *)font_{
[super setFont:font_];
NSLog(@"Setting from for label from XIB for name:%@ size: %.1f - do font theme replacement if needed", self.font.fontName, self.font.pointSize);
}
@end
驚くべきことは、次のログでのクラッシュです。
-[UIButtonLabel setFont:]: unrecognized selector sent to instance 0x9ad1b70
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIButtonLabel setFont:]: unrecognized selector sent to instance 0x9ad1b70'
UIButtonLabel はどこから生まれましたか?
setFont:
セッターで追加のクラスチェックを行っても発生します。
if ([self class] != [UILabel class] || !comes_from_nib) {
[super setFont:font_];
return;
}
サブクラス化せずに UILabel で setFont: setter をオーバーライドする方法はありますか?