我创建了一个包含一些子视图的自定义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];
}
实际初始化子视图的位置以及我可以从哪里开始使用它们?
答案 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];
}
}