我有一个带有子视图的根视图控制器,可以包装子视图控制器的视图。基本思想是我的根控制器具有左右视图控制器,它们都显示在屏幕上(类似于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。但是,偶尔屏幕会短暂地保持白色,并且在右视图控制器(EDIT:和左视图)中不会触发viewWillAppear。所有其他视图生命周期方法均会触发,只是不会触发viewWillAppear。

不幸的是,由于它是复杂且专有的,因此我无法为整个类提供代码。但是在此描述中是否有关于这种间歇性行为的线索?

最佳答案

关于此的一些想法:

一个

看来您的遏制方法未正确调用。对于每个viewController,它们应如下所示:

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

该视图应在addChilddidMove调用之间添加到父视图中。

两次

据我所知,一次最多只能进行一次演示或解雇。即如果要在关闭模态的同时显示(添加)子viewControllers,则会在控制台日志中看到错误,并且不会发生“添加”操作。

我的建议是在模态视图控制器上创建一个委托协议。然后在dismissViewControllerAnimated:completion:的完成块中,调用您的委托方法:
[self dismissViewControllerAnimated:YES completion:^{
   if ([weakSelf.delegate respondsToSelector:@selector(settingsViewControllerDidDismiss:)])
   {
       [weakSelf.delegate settingsViewControllerDidDismiss:self];
   }
}];

在rootViewController中,您将开始在settingsViewControllerDidDismiss或您决定调用该方法的任何对象中添加其子级。关键是在删除操作之后开始“添加”操作。

希望这可以帮助。

关于ios - View Controller 容器偶尔会丢失子 Controller 中的viewWillAppear,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23249867/

10-12 06:15