我有一个带有子视图的根视图控制器,可以包装子视图控制器的视图。基本思想是我的根控制器具有左右视图控制器,它们都显示在屏幕上(类似于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];
该视图应在
addChild
和didMove
调用之间添加到父视图中。两次
据我所知,一次最多只能进行一次演示或解雇。即如果要在关闭模态的同时显示(添加)子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/