我正在尝试继承UILabel
。第一次尝试涉及我的自定义UILabel
只是将属性adjustsFontSizeToFitWidth
设置为YES
。问题是我是iOS编程的新手,并且不确定放置此代码的位置。我尝试了下面的代码,但从未调用它们。
- (id)initWithFrame:(CGRect)frame
{
NSLog(@"init custom label");
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.adjustsFontSizeToFitWidth=YES;
}
return self;
}
- (id)init
{
NSLog(@"init custom label");
self = [super init];
if (self) {
// Initialization code here.
self.adjustsFontSizeToFitWidth=YES;
}
return self;
}
我使用以下方式开始工作:
lblCustom = [lblCustom init];
但是有些我可以自动调用此调用吗?
答案 0 :(得分:6)
在接口构建器中使用标签时,编码使用NSCoder
协议:
- (id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"init custom label");
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code here.
self.adjustsFontSizeToFitWidth=YES;
}
return self;
}
我所做的是创建一个方法来设置我的自定义UI对象,并让所有init调用此方法。
答案 1 :(得分:2)
我个人会远离initWithCoder:
而是使用awakeFromNib
代替。这就是为什么(Apple UIKit Documentation):
nib加载基础结构向每个基础结构发送awakeFromNib消息 从nib存档重新创建的对象,但仅在所有对象之后 存档已加载并初始化。当一个对象收到 一个awakeFromNib消息,它保证有所有的插座和 行动关系已经建立。
我的程序中有各种UI子类,这是我在BaseLabel
课程中提出的解决方案。
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
// We were not loaded from a NIB
[self labelDidLoad:NO];
}
return self;
}
- (void)awakeFromNib
{
[super awakeFromNib];
// We were loaded from a NIB
[self labelDidLoad:YES];
}
- (void)labelDidLoad:(BOOL)loadedFromNib
{
// Do some initialization here...
}
现在我的所有子类都会覆盖{type}didLoad:(BOOL)loadedFromNib
。
例如buttonDidLoad:
,textFieldDidLoad:
和tableViewDidLoad:
(您明白了这一点)。
答案 2 :(得分:1)
在UIView上调用init只与调用initWithFrame:使用zero-rect相同。因此,如果使用nib-files,则应覆盖initWithFrame或initWithCoder。