我应该在viewDidLoad还是viewWillLayoutSubviews中初始化我的viewController?

5
我注意到有时候在viewDidLoad中我能正确获取视图大小,但有时却失败了。
例如:
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.pullToRefreshController = [self.pullToRefreshController initWithDelegate:self];
    PO(self.view);
    PO(self.view.superview);
    PO(self.view.superview.superview);
    PO(self.view.superview.superview.superview);

    while(false);
}
-(void)viewWillLayoutSubviews
{
    PO(self.view);
    PO(self.view.superview);
    PO(self.view.superview.superview);
    PO(self.view.superview.superview.superview);
    while (false);
}

在viewDidLoad时,self.view的大小仍然是320乘以480。在viewWillLayoutSubviews中已经被修正。

我想知道在这之间发生了什么,以及应该在哪里初始化东西?或者什么东西应该在viewDidLoad中,什么东西应该在viewWillLayoutSubviews中?

1个回答

9

viewDidLoad是一个很好的地方,可以创建和初始化您希望添加到主视图的子视图。它也是一个进一步自定义主视图的好地方。它也是初始化数据结构的好地方,因为此时 view controller 上的任何属性都应该已被设置。通常只需执行一次。

viewWillLayoutSubviews是在需要时定位和布局子视图的位置。这将在旋转或其他事件导致视图控制器的视图被调整大小后调用。这可能会在视图控制器的生命周期中发生多次。您应该仅在此处布置视图。


完美。这也是确保我们的视图适合父视图(在包含情况下)的好地方。 - user4951
你应该只在这里布局视图。"只"的意思是不要在这里创建视图吗? - mfaani
1
@Honey 不要在 viewWillLayoutSubviews 中创建视图。 - rmaddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接