swift навигационный контроллер возвращает ноль при попытке перейти к другому View Controller - PullRequest
0 голосов
/ 06 января 2020

У нас есть класс Router для навигации viewController к другому контроллеру представления. Он работает, как и ожидалось, но когда случайным образом viewControllersStack получает ноль, и происходит sh. Мы пытались использовать его «если позволено», чтобы избежать взлома sh, но проблема здесь в том, что черный экран появился, когда viewControllersStack равен нулю. поэтому мы вернули его обратно. Можете ли вы предложить, почему стек навигации равен нулю, если навигация равна нулю, как с ним обращаться?

private func PopOrPushToViewController(_ strControllerClass: String) {

    //get the list of controllers in the stack
    let viewControllersStack: [UIViewController] = self.navigationController!.viewControllers as [UIViewController]
    var boolDidNaviagtion = false
    for viewController in viewControllersStack {
        if boolDidNaviagtion {
            viewController.removeFromParent()
        }
        if String(describing: type(of: viewController)) == strControllerClass {
            boolDidNaviagtion = true
            self.navigationController?.popToViewController(viewController, animated: true)
        }
    }
    if !boolDidNaviagtion {
        let viewController = NavigationController.sharedInstance.storyboardViewControllerFromString(strControllerClass)!
        self.navigationController!.pushViewController(viewController, animated: true)
    }
}



class AddTripViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func navigate(_ sender: Any) {
        popOrPushToViewController( "ListViewController")
    }

}

1 Ответ

0 голосов
/ 06 января 2020

Возможно, проблема в том, что вы используете:

viewController.removeFromParent()

Если вы поставите pop на V C в стеке, остальные VC будут автоматически удалены.

Попробуйте изменив веселье c на это:

private func PopOrPushToViewController(_ strControllerClass: String) {

    // get the list of controllers in the stack
    if let vcStack: [UIViewController] = self.navigationController?.viewControllers {

        var didPop = false

        for vc in vcStack {

            // if we find the desired VC already in the navVC's stack of controllers,
            // pop to it, set the didPop flag to true, and quit looking
            if String(describing: type(of: vc)) == strControllerClass {
                self.navigationController?.popToViewController(vc, animated: true)
                didPop = true
                break
            }

        }

        // if we did NOT pop to the desired VC,
        // instantiate it and push it onto the stack
        if !didPop {
            if let vc = NavigationController.sharedInstance.storyboardViewControllerFromString(strControllerClass) {
                navigationController?.pushViewController(vc, animated: true)
            }
        }

    }

}
...