在哪里调用[self addSubView]?

时间:2012-01-04 09:40:47

标签: objective-c ios cocoa-touch

我有一个自定义视图,我需要以编程方式添加几个子视图。哪个是创建和添加这些子视图的最佳位置? Apple docs说:

  

如果您的视图类管理一个或多个完整的子视图,请执行以下操作:在视图的初始化序列中创建这些子视图。

这对我来说有点不清楚。我应该在initWithFrameinitWithCoder还是其他地方处理?

请注意,我不是在谈论控制器,这是一个需要初始化自己的视图。

4 个答案:

答案 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工作正常,但是对于非常重要的东西,初始化方法是可行的方法。