0

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 をオーバーライドする方法はありますか?

4

1 に答える 1

4

カテゴリ内でスーパー メソッドを呼び出すことはできません。一度もない!これは、カテゴリを使用してクラスの機能を拡張する場合には不可能です。クラスを拡張するのではなく、実際には既存のメソッドを完全にオーバーライドし、元のメソッドを完全に失います。そのため、エラーが表示されます。

于 2012-09-18T10:37:28.737 に答える