iOS - 为什么在initWithNibName中设置和显示子视图不起作用?

时间:2014-10-23 04:36:14

标签: ios uiview interface-builder xib

我有一个简单的xib文件,其布局为:

enter image description here

在我的UIViewController类中,浅绿色UIView被引用到IBOutlet view_content。然后我在ViewController.m的initWithNibName:bundle:中执行了以下操作:

self = [super initWithNibName:nibNameOrNil bundle:nil];
if (self) {

    self.view_a = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    self.view_a.backgroundColor = [UIColor purpleColor];
    [self.view_content addSubview:self.view_a];

    self.view_b = [[UIView alloc] initWithFrame:CGRectMake(150, 150, 100, 100)];
    self.view_b.backgroundColor = [UIColor blueColor];
    [self.view_content addSubview:self.view_b];

    self.view_c = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 100, 100)];
    self.view_c.backgroundColor = [UIColor greenColor];
    [self.view_content addSubview:self.view_c];

}
return self;

我预计会有3个小方块,每个小方块都有不同的颜色,如上面的代码所示,但它们没有显示加载和显示的视图。但是,如果我将addSubView:次调用移至viewDidLoad,则会按预期显示。我试图在if-segment中测试view_content是否为零,并且当时似乎是零。我不明白为什么会这样,它是如何工作的,是不是视图和它的组件应该从xib加载?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在调用initWithNibName:...点时,视图本身尚未加载。这是一种优化(延迟加载),它会延迟加载视图,直到实际需要它为止。首次访问viewController.view时实际加载了该视图,并且在调用viewDidLoad时加载了该视图。

有些人通过调用[viewController view](或[self view],如果它在视图控制器的类中)强制视图控制器加载其视图。

答案 1 :(得分:0)

原因很简单。初始化控制器时,当前未加载视图意味着initWithNibName。所以最好的地方是viewDidLoad,你的所有插座已经分配。