【发布时间】:2012-09-18 10:11:58
【问题描述】:
我创建了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: setter 中进行额外的类检查,也会发生这种情况:
if ([self class] != [UILabel class] || !comes_from_nib) {
[super setFont:font_];
return;
}
有没有什么方法可以覆盖 UILabel 中的 setFont: setter 而不进行子类化?
【问题讨论】:
-
你从哪个类和方法调用[super setFont:font_];
-
如源代码所示:它是由类别本身调用的。主要目的是在设置 XIB 网点时获取(字体属性)。
-
我的意思是你从哪个类或视图控制器调用了这个函数
-
我从不直接调用它。加载和解码XIB到内存时被系统调用。
标签: iphone ios uilabel categories