【问题标题】:Change root view controller of AppDelegate cause an exception of UIViewControllerHierarchyInconsistency更改 AppDelegate 的根视图控制器导致 UIViewControllerHierarchyInconsistency 异常
【发布时间】:2019-03-06 08:21:45
【问题描述】:

AppDelegate之外,我想更改它的rootViewController。换句话说,我想在我之前的窗口中放置一个新的导航控制器,然后在这个导航控制器中推送新的控制器:

func JumpToPage(_ controller: UIViewController) {
        guard let rootController = AppDelegate.shared?.presentationViewController else {
            return
        }
        let navigationController = UINavigationController(rootViewController: rootController)
        navigationController.pushViewController(controller, animated: true)
        AppDelegate.shared?.window?.rootViewController = navigationController
    }
}

但是这个函数会导致应用程序崩溃并显示以下错误消息:

Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency',
    reason: 'adding a root view controller <MyExampleController> as a child of view controller:<UINavigationController>'

我该如何解决?

【问题讨论】:

    标签: ios swift uiviewcontroller uinavigationcontroller appdelegate


    【解决方案1】:

    改变

    let navigationController = UINavigationController(rootViewController: rootController)
    

    let navigationController = UINavigationController(rootViewController: controller)
    

    更新

    func JumpToPage(_ controller: UIViewController) {
        guard let rootController = AppDelegate.shared?.presentationViewController else {
            return
        }
        let navigationController = UINavigationController(rootViewController: controller)
        AppDelegate.shared?.window?.rootViewController = navigationController
    }
    

    【讨论】:

    • 我希望将导航控制器放在我之前在窗口中的顶部,然后将新控制器推入其中,所以这个解决方案无法帮助它
    【解决方案2】:

    我没有尝试替换导航控制器,而是替换初始导航控制器中的根 VC,如下所示。

    在 AppDelegate 中:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions ...) {
        let storyboard = UIStoryboard(name: "FirstVC", bundle: Bundle.main)
        let firstViewController = instantiateInitialViewController()! as! FirstViewController
        navigationController = UINavigationController(rootViewController: firstViewController)
        window = UIWindow(frame: UIScreen.main.bounds)
        window!.rootViewController = navigationController
        window!.makeKeyAndVisible()
        return true
    }
    

    然后,我在 FirstViewController 中更改根 VC,如下所示:

    func someFuncInFirstVC() {
        let allControllers = NSMutableArray(array: self.navigationController!.viewControllers)
        allControllers.removeObject(at: allControllers.count - 1)  // remove root VC, count should be one...
        let secondViewController = SecondViewController()
        allControllers.add(secondViewController as AnyObject)  // this becomes new root VC since nav stack is empty now
        navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: true)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2013-01-13
      相关资源
      最近更新 更多