模态解雇后返回导航控制器索引(无故事板)

时间:2016-12-06 23:45:39

标签: uiviewcontroller uinavigationcontroller swift3 uitabbarcontroller

我试图从导航控制器堆栈中以模态方式呈现视图控制器,然后在解雇后返回到该特定视图控制器索引。此NavigationController位于UITabBarController

之内

我的应用程序是用XIB和程序导航控制器和标签栏控制器编写的。我没有使用故事板。导航控制器导航全部使用self.navigationController.pushViewController(viewController: TabOnePageTwoViewController, animated: true)

完成

这是我的视图控制器配置。

RootTabBarController - > UINavigationController(rootViewController: TabOneController) - > TabOnePageOneController - > ModalView

问题是,当我在模态呈现视图中self.dismiss()时,我返回到导航控制器的根,而不是显示模态的视图TabOneController

我认为正确的方法是从导航控制器堆栈中选择视图控制器,并选择正确的popToViewController

为了实现这一点,我想在self.dismiss()的完成块中我需要导航到正确的视图控制器。

    let viewControllers = self.navigationController!.viewControllers

    self.dismiss(animated: true, completion: {
        for aViewController in viewControllers {
            if(aViewController is TabOnePageTwoViewViewController){
                print("navigating back to page one now")
                self.navigationController!.popToViewController(aViewController, animated: true);
            }
        }
    })

`

不幸的是,这不起作用。据我所知,self.navigationController无法从模态视图中访问。

如何在解除显示的模态后返回导航控制器索引?

我已将示例应用程序上传到github,网址为:https://github.com/thexande/TabControllerAndNavigationControllerExample

如果您熟悉IOS内的编程导航,请下载并查看!

感谢所有!!

1 个答案:

答案 0 :(得分:1)

我在Github上查看了您的示例项目。

为什么示例项目无法正常运行,只有一个小问题。

您应该使用RootTabBarViewController viewDidLoad方法设置navigationStack,而不是viewWillAppear。这是一些奇怪的行为,可能是框架中的一个错误,我找不到任何文档,为什么它应该发生在那里,但确实如此。

请删除viewWillAppear,您的viewDidLoad应如下所示:

override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
        let tabOne = UINavigationController(rootViewController: TabOneViewController())
        tabOne.title = "Tab One"
        let tabTwo = UINavigationController(rootViewController: TabTwoViewController())
        tabTwo.title = "Tab Two"
        self.viewControllers = [tabOne, tabTwo]
}