Изменение корневого контроллера представления AppDelegate вызывает исключение UIViewControllerHierarchyInconsistency - PullRequest
0 голосов
/ 01 октября 2018

За пределами 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>'

Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Вместо того, чтобы пытаться заменить контроллер навигации, я заменяю корневой 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
}

Затем я меняю корневой VC w/ в FirstViewController следующим образом:

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)
}
0 голосов
/ 01 октября 2018

Изменение с

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
}
...