UIView - 自定义视图 - 视图的子视图在哪里初始化?

时间:2014-09-14 21:12:08

标签: ios objective-c cocoa-touch uiview

我创建了一个包含一些子视图的自定义UIView。 在IB中,我将我的子视图设置为一个UIView的CreateAlbumView,并创建了一些子视图并将其显示出来。

当我在代码中膨胀此视图并将其添加到超级视图时,将调用以下代码:

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self)
        [self setViews];
    return self;
}

但子视图都是零 - 使我的setViews()函数变得无用。

我已经更改了我的代码以在以下函数中设置代码,但它看起来并不正确:

-(void)layoutSubviews {
    [super layoutSubviews];
    [self setViews];
}

实际初始化子视图的位置以及我可以从哪里开始使用它们?

2 个答案:

答案 0 :(得分:4)

你应该使用

- (void)awakeFromNib

nib-loading基础结构将awakeFromNib消息发送到从nib归档重新创建的每个对象,但只有在归档中的所有对象都已加载并初始化之后。当对象收到awakeFromNib消息时,保证已建立所有插座和操作连接

答案 1 :(得分:1)

  

我已经更改了我的代码以设置layoutSubviews中的代码,但它   看起来不对。

- 好吧,有一个方法创建视图(由于cocoa约定,setViews是一个坏名称)并将它们布局并在layoutSubviews中添加它们,而不是layoutSubviews正是它的确是什么顾名思义。

-(id)initWithCoder:(NSCoder *)aDecoder 
{
    self = [super initWithCoder:aDecoder];
    if (self)
        [self createSubviews];
    return self;
}

-(void)layoutSubviews 
{
    [super layoutSubviews];
    for (UIView *v in mySubviews) {
        v.frame = CGRectMake(...);
        [self addSubview:v];
    }
}