子视图控制器应该有父视图控制器,但实际的父级是 (UIViewControllerHierarchyInconsistency)。

7

我有一个应用程序,其初始窗口是UITabbarController(在登录后将其设置为rootViewController)

这个tabbarController有4个不同的选项卡,它们都是嵌入在UINavigationController中的UIViewControllers。

在我的tabbarController中,当我进行初始配置时,我将选项卡设置如下:

  • First I create the viewControllers:

    let tableViewController1 = tableViewController1(nibName: "tableViewController1", bundle: nil)
    let tableViewController2 = tableViewController2(nibName: "tableViewController2", bundle: nil)
    let tableViewController3 = tableViewController3(nibName: "tableViewController3", bundle: nil)
    let profileViewController = ProfileViewController(nibName: "ProfileViewController", bundle: nil)
    
  • Then I embed them inside navigationControllers:

    let navController1 = UINavigationController(rootViewController: tableViewController1)
    let navController2 = UINavigationController(rootViewController: tableViewController2)
    let navController3 = UINavigationController(rootViewController: tableViewController3)
    let navController4 = UINavigationController(rootViewController: profileViewController)
    
  • Finally, add the navigationControllers as tabbarController's viewControllers

    viewControllers = [navController1,navController2,navController3,navController4]

我在网上查了一下,这种使用方式似乎是正确的。例如:https://medium.com/@ITZDERR/uinavigationcontroller-and-uitabbarcontroller-programmatically-swift-3-d85a885a5fd0。但是我从我的应用程序收到以下崩溃日志。

Crash, child view controller:<UINavigationController: 0x160b3400>
should have parent view controller:<ProfileViewController: 0x16098800>
but actual parent is:<MyApp.MainTabBarController: 0x16064c00>

这里的问题是,崩溃信息显示profileViewController应该是navigationController的父控制器,但是我将profileViewController嵌套在navigationController中,并将其添加为tabbarController的viewControllers,所以在我看来顺序是正确的。

我搜索了这个崩溃,看起来我可能漏掉了使用addChildViewController或者在某处删除父控制器的步骤,但我没有找到具体原因。

我找到了一些相关链接,但它们都没有帮助我解决这个问题。

示例链接:


1
你找到解决方案了吗?我也遇到了类似的问题。 - hyouuu
2
我确实解决了它,但已经很长时间了,我不记得怎么做了 :_) 至少我可以提出一个建议,可能会解决这个问题。我增加了0.1秒的延迟时间,如果我没记错的话,应该可以解决它。希望能对您有用 :) - Radun C
啊,延迟的那个东西 - 谢谢! - hyouuu
1个回答

2
遇到了同样的问题,加入 layoutifneeded() 对我有效。以下是示例:
navigationController.setViewControllers([], animated: false)
navigationController.view.layoutIfNeeded()

问题在于 navigaionController 不能立即删除 viewControllerslayoutifneeded 告诉系统立即重新绘制,因此不会发生崩溃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接