我有一个使用选项卡应用程序模板创建的应用程序(ARC,iOS 4)。
- 有几个选项卡,在第二个选项卡的视图控制器的视图(ViewCont2)上有一个按钮。
- 此按钮通过presentModalViewController方法加载另一个视图控制器(ModalViewCont)的视图。
- ModalViewCont上有一个关闭按钮,调用dismissModalViewControllerAnimated。
- 在ViewCont2的viewDidDisappear中,我将self.view = nil和其他插座设置为nil以卸载视图,以便下一次出现在屏幕上时将其重新加载。我这样做是因为它继承自一个基类(BaseViewCont),该基类初始化视图控制器的一些通用属性,并在viewDidLoad方法中添加一些按钮、标签等。因此,从该基类继承的视图控制器可以根据需要在其viewDidLoad方法中不同地配置这些属性。
问题
现在,当ModalViewCont在屏幕上时,按Home按钮将应用程序放在后台,然后再获取应用程序,关闭ModalViewCont不会带回ViewCont2的视图,而是带回一个黑屏和底部的选项卡栏。如果在点击第二个选项卡之前点击其他选项卡,则会发生相同的情况。(编辑:如果在viewWillDisappear而不是viewDidDisappear中将self.view设置为nil,则会发生这种情况。)
我确定ViewCont2加载了一个新视图(检查了它的引用),但是视图的父视图为空,因此不显示新视图,而是黑屏。
未起作用的方法
- 在设置self.view = nil之前使用[self.view removeFromSuperview];
- 在viewWillAppear中将视图添加到父视图;[self.parentViewController.view addSubview:self.view]; 这个方法没有很流畅地工作,视图略微向上放置。这是因为层次结构中有几个其他的父视图。
我考虑的解决方法;
- 1- 如果在viewDidLoad中Superview为空,它会在viewWillAppear中变为可用(假设)。因此,ViewCont2的viewWillAppear方法可以使用以下代码正确加载Superview;
_
if (self.view.superview == nil)
{
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
- 2- 可以使用基类的viewWillAppear方法进行初始化,这样就不需要卸载视图了。因此,性能可以优化,它将不会在每次视图消失时被卸载。而且,通过检查一个标志只执行一次初始化会更好,而不是每次出现都执行。
问题
- 1- 为什么父视图没有恢复?我该怎么做才能解决这个问题?(这是我想要理解和解决的主要问题,而不是尝试替代方案...)
- 2- 将nil分配给视图以卸载它是否有错?如果是,那么在这种情况下(选项卡应用程序),如何正确卸载视图?
- 3- 第一种解决方案有什么问题吗?看起来像是一个临时解决办法吗?关于父视图和视图出现的假设是否正确?
编辑:看起来当viewDidLoad比它应该更早地被调用时(即在viewWillDisappear中nilled视图而不是在viewDidDisappear中),superview没有设置。