我有一个自定义视图,我需要以编程方式添加几个子视图。哪个是创建和添加这些子视图的最佳位置? Apple docs说:
如果您的视图类管理一个或多个完整的子视图,请执行以下操作:在视图的初始化序列中创建这些子视图。
这对我来说有点不清楚。我应该在initWithFrame
,initWithCoder
还是其他地方处理?
请注意,我不是在谈论控制器,这是一个需要初始化自己的视图。
答案 0 :(得分:9)
initWithFrame
是您以编程方式创建UIView的方法,而当从XIB实例化UIView时会调用initWithCoder
。
所以这一切都取决于你将如何创建包含视图。 一种涵盖所有案例的方法:
- (id) initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])){
[self setUpSubViews];
}
return self;
}
- (id) initWithCoder:(NSCoder*)aDecoder
{
if ((self = [super initWithCoder:aDecoder])){
[self setUpSubViews];//same setupv for both Methods
}
return self;
}
- (void) setUpSubViews
{
//here create your subviews hierarchy
}
答案 1 :(得分:3)
执行以下操作:选择适合您视图的指定初始值设定项的方法。也就是说,它是每个其他初始化程序调用的最可配置的(即大多数参数)init ...方法。例如,它最常见的是-initWithFrame:。然后按如下方式实现此方法:
- (id) initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
// add new views here, for example:
UIImageView *imageView = [[UIImageView alloc] initWithImage:anImage];
[self addSubview:imageView];
[imageView release];
}
return self;
}
答案 2 :(得分:0)
通常,如果要始终显示视图,则应在父视图控制器的viewdidload / viewwillappear中创建视图和[self addSubView]。你也可以把它隐藏起来。在某些其他情况下,您希望在按钮单击或其他操作上显示视图,您应该相应地添加子视图。
答案 3 :(得分:0)
通过积分,它们意味着重要或大规模。 viewDidLoad工作正常,但是对于非常重要的东西,初始化方法是可行的方法。