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

Rad*_*n C 7 crash uinavigationcontroller childviewcontroller view-hierarchy swift

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

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

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

  • 首先我创建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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后我将它们嵌入到 navigationControllers 中:

    let navController1 = UINavigationController(rootViewController: tableViewController1)
    let navController2 = UINavigationController(rootViewController: tableViewController2)
    let navController3 = UINavigationController(rootViewController: tableViewController3)
    let navController4 = UINavigationController(rootViewController: profileViewController)
    
    Run Code Online (Sandbox Code Playgroud)
  • 最后,将 navigationControllers 添加为 tabbarController 的 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>
Run Code Online (Sandbox Code Playgroud)

这里的问题是崩溃说 profileViewController 应该是 navigationController 的父级,但是我将 profileViewController 嵌入到 navigationController 中并添加为 tabbarController 的 viewControllers,所以在我看来顺序是正确的。

我搜索了这个崩溃,似乎我正在跳过使用 addChildViewController 或在某处删除父级的步骤,但无法弄清楚。

我找到了与此相关的链接,但没有人帮助我解决了这个问题。

示例链接:

小智 2

遇到了同样的问题,添加layoutifneeded()对我有用。下面的例子:

navigationController.setViewControllers([], animated: false)
navigationController.view.layoutIfNeeded()
Run Code Online (Sandbox Code Playgroud)

问题是navigaionController不会viewControllers立即删除。 layoutifneeded告诉系统立即重画。所以崩溃不会发生。