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 在应用程序加载之前崩溃

initWithNibName与一般init的区别

ios5 上的dismissViewControllerAnimated 崩溃

卡在 initWithNibName

initWithNibName、awakeFromNib 和 viewDidLoad 的描述?

UIViewController 的 initWithNibName:这个设计背后的原因?