UILabel类和setFont:崩溃

时间:2012-09-18 10:11:59

标签: iphone ios uilabel categories

我创建了UILabel类别,当font属性发生变化时,这会做额外的工作。

我选择了类别而非子类,所以我不必为所有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: setter:

中进行了额外的类检查,也会发生这种情况
if ([self class] != [UILabel class] || !comes_from_nib) {

        [super setFont:font_];
        return;

    }

有没有办法在没有子类化的情况下覆盖UILabel中的setFont:setter?

1 个答案:

答案 0 :(得分:4)

你不能在类别中调用超级方法!决不! 当您使用类别来扩充类的功能时,这是不可能的,您没有扩展类,实际上完全覆盖现有方法,您完全失去了原始方法。这就是你的错误出现的原因。