UILabel初始化时调用的函数

时间:2013-11-11 09:21:44

标签: ios objective-c uilabel

我正在尝试继承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];

但是有些我可以自动调用此调用吗?

3 个答案:

答案 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。