2

我正在尝试子类化UILabel. 第一次尝试涉及我的自定义UILabel只是将属性设置adjustsFontSizeToFitWidthYES. 问题是我是 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];

但是有什么办法可以让这个电话自动被调用吗?

4

3 回答 3

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 调用此方法。

于 2013-11-11T09:28:00.200 回答
3

我个人会远离initWithCoder:并改为使用awakeFromNib。这就是原因(Apple UIKit 文档):

nib 加载基础结构向从 nib 存档重新创建的每个对象发送 awakeFromNib 消息,但前提是存档中的所有对象都已加载和初始化。当一个对象收到一个 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:(你明白了)。

于 2013-11-22T14:16:12.377 回答
1

在 UIView 上仅调用 init 与使用零矩形调用 initWithFrame: 相同。因此,如果您使用 nib 文件,则应覆盖 initWithFrame 或 initWithCoder。

于 2013-11-11T09:26:18.670 回答