gpt4 book ai didi

ios - 黑屏 - superview 在 vi​​ewWillAppear 中为 nil

转载 作者:可可西里 更新时间:2023-11-01 03:09:38 25 4
gpt4 key购买 nike

我有一个从选项卡式应用程序模板创建的应用程序。 (ARC, iOS 4)

  • 有几个选项卡,2. 选项卡上有一个按钮 viewcontroller.view(ViewCont2)。
  • 此按钮通过 presentModalViewController 方法加载另一个 View Controller 的 (ModalViewCont) View 。
  • 在调用 dismissModalViewControllerAnimated 的 ModalViewCont 上有一个关闭按钮。
  • 在 ViewCont2 的 viewDidDisappear 中,我将 self.view = nil 和其他导出设置为 nil 以卸载 View ,以便下次它出现在屏幕上时重新加载。我这样做是因为它继承自一个基类(BaseViewCont),它初始化 View Controller 的一些一般属性,并在 viewDidLoad 方法中添加一些按钮、标签等。因此,从该基类继承的 ViewController 可以根据需要在其 viewDidLoad 方法中以不同方式配置这些属性。

问题

现在,当 ModalViewCont 出现在屏幕上时,按下 Home 按钮将应用程序置于后台,并且在取回应用程序后,关闭 ModalViewCont 不会带回 ViewCont2 的 View ,而是一个底部带有标签栏的黑屏。没有放置应用程序背景/前景也会发生同样的事情;如果在点击 2. 选项卡之前点击了其他选项卡。(编辑: 只有当 self.view 在 vi​​ewWillDisappear 而不是 viewDidDisappear 中设置为 nil 时才会发生这种情况。)

我确定 ViewCont2 加载了一个新 View (检查了它的引用)但是 View 的父 View 是 nil,所以新 View 没有显示,而是黑屏。

不起作用的东西

  • 使用 [self.view removeFromSuperview];在设置 self.view=nil 之前,
  • 在 viewWillAppear 中将 View 添加到父级; [self.parentViewController.view addSubview:self.view];这一个工作不顺利, View 略高于屏幕。这是因为层次结构中还有其他几个父 View 。

我考虑过的解决方案;

  • 1- 如果 viewDidLoad 中的 superview 为 nil,则它在 viewWillAppear (假设) 中变得可用。因此,ViewCont2 的 viewWillAppear 方法可用于通过以下方式正确加载 super View ;

_

if (self.view.superview == nil)
{
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
  • 2- 可以使用基类的 viewWillAppear 方法代替初始化,因此无需卸载 View 。因此,可以优化性能,不会在每次 View 消失时都卸载它。此外,最好通过检查标志只执行一次初始化,而不是每次出现时都执行初始化。

问题

  • 1- 为什么 super View 没有恢复?我应该为它做什么? (这是我想了解和解决的主要问题,而不是尝试替代方案...)
  • 2- 我将 nil 分配给 View 以卸载它是不是做错了什么?如果是这样,在这种情况下(选项卡式应用程序)我应该如何正确卸载 View ?
  • 3- 1 有什么问题吗?解决方案?看起来像个 SCSS 吗? 关于 superview 和 viewWillAppear 的假设是否正确?

编辑: 似乎当 viewDidLoad 被调用的时间早于它应该调用的时间(即,当 View 在 viewWillDisappear 而不是 viewDidDisappear 中为 nilled 时),未设置 super View 。

最佳答案

这看起来很奇怪,但您的建议 (1) 确实是解决此问题的正确方法:

-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

if (!self.view.superview) { // check if view has been added to view hierarchy
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
}

你的第二个建议对性能有好处(因为 View 加载是一项昂贵的操作) - 但它不会解决问题。在以下情况下,您也可以在不将 View 设置为 nil 的情况下以黑屏结束(在 iOS 模拟器中进行测试):

  1. 打开模态视图
  2. 模拟内存警告 -> 这将卸载 tabbarcontroller 中的 View
  3. 按主页按钮并再次打开应用
  4. 关闭模态视图 -> 黑屏

通常您可以假设在 viewDidLoad 中设置了 View 属性,并且在 viewWillAppear + viewDidAppear 中 View 已添加到 View 层次结构中;所以那个时候superview应该就在了(这里的superview是UIViewControllerWrapperView类的tabbarcontroller的私有(private) View )。然而,在我们的例子中,虽然 View 被重新加载(在应用程序恢复时),但它没有添加到 View 层次结构中,导致黑屏。这似乎是 UITabBarController 中的错误。

解决方法强制再次执行外观选择器。所以 viewWillAppear 将再次被调用,这次有一个 super View 。 viewDidAppear 也会被调用两次!

将 self.view 设置为 nil 是可以的,但在大多数情况下没有必要。让系统决定何时卸载 View (iOS 可以在内存不足时卸载 View )。 View Controller 代码的设计方式应使 UI 无需重新加载 View 即可随时重新配置。

关于ios - 黑屏 - superview 在 vi​​ewWillAppear 中为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11988711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com