【发布时间】:2012-08-12 21:27:14
【问题描述】:
我有一个从选项卡式应用程序模板创建的应用程序。 (ARC,iOS 4)
- 有几个选项卡,2.选项卡viewcontroller.view(ViewCont2)上有一个按钮。
- 此按钮通过 presentModalViewController 方法加载另一个视图控制器的(ModalViewCont) 视图。
- ModalViewCont 上有一个关闭按钮,它调用dismissModalViewControllerAnimated。
- 在 ViewCont2 的 viewDidDisappear 中,我将 self.view = nil 和其他出口设置为 nil 以卸载视图,以便下次它出现在屏幕上时会重新加载。我这样做是因为它继承自一个基类(BaseViewCont),该基类初始化视图控制器的一些通用属性并在 viewDidLoad 方法中添加一些按钮、标签等。因此,从该基类继承的 ViewController 可以在其 viewDidLoad 方法中以不同方式配置这些属性。
问题
现在,当 ModalViewCont 出现在屏幕上时,按下 Home 按钮将应用程序置于后台,并在返回应用程序后,关闭 ModalViewCont 不会带回 ViewCont2 的视图,而是黑屏,底部有标签栏。没有将应用程序放在后台/前台也会发生同样的事情;如果在点击 2. 标签之前点击了其他标签。(编辑:仅当 self.view 在 viewWillDisappear 而不是 viewDidDisappear 中设置为 nil 时才会发生这种情况。)
我确定 ViewCont2 加载了一个新视图(检查了它的引用),但视图的超级视图为零,因此新视图不显示,而是黑屏。
没用的东西
- 使用 [self.view removeFromSuperview];在设置 self.view=nil 之前,
- 在 viewWillAppear 中向父级添加视图; [self.parentViewController.view addSubview:self.view];这一个运行不顺利,视图略微位于屏幕上方。这是因为层次结构中还有其他几个超级视图。
我考虑过的解决方案;
- 1- 如果 viewDidLoad 中的 superview 为 nil,则它在 viewWillAppear 中变为可用(假设)。因此,可以使用 ViewCont2 的 viewWillAppear 方法来正确加载父视图;
_
if (self.view.superview == nil)
{
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
- 2- 基类的 viewWillAppear 方法可用于初始化,因此无需卸载视图。因此,可以优化性能,每次视图消失时都不会卸载它。此外,最好通过检查标志只执行一次初始化,而不是每次出现时都执行。
问题
- 1- 为什么superview没有恢复?我该怎么做? (这是我想要理解和解决的主要问题,而不是尝试替代方案......)
- 2- 分配 nil 来查看卸载它是不是做错了什么?如果是这样,在这种情况下我应该如何正确卸载视图(选项卡式应用程序)?
- 3- 1 有什么问题吗?解决方案?它看起来像一个kludge吗? 关于 superview 和 viewWillAppear 的假设是否正确?
编辑:似乎当 viewDidLoad 被提前调用时(即当视图在 viewWillDisappear 而不是 viewDidDisappear 中被取消时),superview 没有设置。
【问题讨论】:
-
因为我没有你的代码或基类,我想把问题最小化一点,所以我可以编码和呈现。有 tabViewController,3 个选项卡,第二个选项卡有一个按钮,你点击按钮,一个新的视图以模态方式呈现。 modalView 有一个导致它被关闭的按钮,而您想要发生的是 viewController2 的新实例进入视图,一切顺利且用户不明智。请指教。
-
您准确定义了它。我在子类中没有什么特别之处。只需使用选项卡式应用模板并从它的 nib 创建模态视图并使用 presentmodalview 方法。
-
我在呈现视图而不是在呈现视图上调用解除方法。可能是导致问题的原因。我还没有时间测试它。
-
你应该尽快测试一下,因为赏金在 3 天后到期,如果你有一个可能的修复待定,没有人会尝试调试这个。它只会过期,对任何人都没有任何好处。
-
我曾尝试直接调用 parentViewControllerdismissModal... 并通过 parent 的委托调用它,但它们都没有帮助。
标签: ios objective-c view superview