视图控制器容器偶尔会错过子控制器中的viewWillAppear

时间:2014-04-23 16:11:00

标签: ios objective-c uiviewcontroller uiview-hierarchy

我有一个根视图控制器,子视图是子视图控制器视图的包装器。基本思路是我的根控制器有一个左右视图控制器,都存在于屏幕上(类似于splitviewcontroller)。加载时,将在根视图控制器上弹出模式视图,并询问详细信息。然后,模态视图与服务器联系,并在收到响应后被解除。然后,根控制器使用以下代码添加子视图控制器:

[self addViewController:self.leftViewController];
[self addViewController:self.rightViewController];

[self addView:self.rightViewController.view ToWrapper:self.rightViewWrapper];
[self addView:self.leftViewController.view ToWrapper:self.leftViewWrapper];

添加视图控制器的位置是:

[self addChildViewController:controller];
[controller didMoveToParentViewController:self];

和addViewToWrapper只是将视图控制器的视图添加到rootViewController的相关子视图中,如下所示:

[[viewWrapper.contentView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
newSubview.frame = viewWrapper.contentView.bounds;
newSubview.autoresizingMask = UIViewAutoresizingFlexibleHeight |    UIViewAutoresizingFlexibleWidth;
[viewWrapper.contentView addSubview:newSubview];

99%的时间这个工作正常。两个视图都会立即显示,并且viewWillAppear会在两个子控制器中触发。但是,有时屏幕会在短时间内保持白色,并且viewWillAppear不会在右视图控制器中触发(编辑:和左侧)。所有其他视图生命周期方法都会触发,而不是viewWillAppear。

不幸的是,我无法为全班提供代码,因为它复杂且专有。但是这个间歇行为的描述中是否有任何线索?

1 个答案:

答案 0 :(得分:2)

对此的一些想法:

<强> ONE

看起来你的收容方法没有被正确调用。对于每个viewController,它们应该如下所示:

    [self addChildViewController:controller];
    [self.view addSubview:controller.view]; 
    [controller didMoveToParentViewController:self];

视图应添加到addChilddidMove来电之间的超级视图中。

<强> TWO

据我所知,一次不能有多次演示或解雇。即如果您尝试在模式被关闭的同时呈现(添加)您的子视图控制器,您将在控制台日志中看到错误,并且不会发生“添加”操作。

我的建议是在模态viewcontroller上创建一个委托协议。在dismissViewControllerAnimated:completion:的完成块中,调用您的委托方法:

[self dismissViewControllerAnimated:YES completion:^{
   if ([weakSelf.delegate respondsToSelector:@selector(settingsViewControllerDidDismiss:)])
   {
       [weakSelf.delegate settingsViewControllerDidDismiss:self];
   }
}];

在你的rootViewController中,你会开始在settingsViewControllerDidDismiss内或者你决定调用该方法的任何内容中添加它的子节点。关键是在解雇操作之后“添加”操作开始。

希望这有帮助。