iOS - 为啥在 initWithNibName 中设置和显示子视图不起作用?
Posted
技术标签:
【中文标题】iOS - 为啥在 initWithNibName 中设置和显示子视图不起作用?【英文标题】:iOS - Why setting and displaying subviews in initWithNibName doesn't work?iOS - 为什么在 initWithNibName 中设置和显示子视图不起作用? 【发布时间】:2014-10-23 04:36:13 【问题描述】:我有一个简单的 xib 文件,它的布局是:
在我的 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
,它们会按预期显示。我试图测试 view_content
在 if 段中是否为零,并且当时似乎为零。我不明白为什么会发生这种情况以及它是如何工作的,视图及其组件不应该从 xib 加载吗?
感谢您的帮助!
【问题讨论】:
【参考方案1】:在调用initWithNibName:...
时,视图本身尚未加载。这是一种优化(延迟加载),延迟加载视图,直到实际需要它。在第一次访问viewController.view
时实际加载视图,也就是调用viewDidLoad
时。
有些人通过调用[viewController view]
(或[self view]
,如果它在视图控制器的类中)来强制视图控制器加载其视图。
【讨论】:
感谢您的回复,这是否意味着我应该在viewDidLoad
中进行视图相关内容的所有初始化和布局,而我仍然可以在initWithNibname:...
中处理其他变量初始化,例如 BOOL?跨度>
抱歉选择迟了,谢谢你的解释,让我明白了很多逻辑流程!【参考方案2】:
原因很简单。初始化控制器时未加载视图意味着 initWithNibName。所以最好的地方是 viewDidLoad 你所有的出口都被分配了。
【讨论】:
以上是关于iOS - 为啥在 initWithNibName 中设置和显示子视图不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
UINib initWithNibName 在应用程序加载之前崩溃
ios5 上的dismissViewControllerAnimated 崩溃