导航控制器中的更改顺序

Posted

技术标签:

【中文标题】导航控制器中的更改顺序【英文标题】:Change order in Navigation Controller 【发布时间】:2017-01-27 09:06:49 【问题描述】:

我正在使用 Swift3。如图所示,我有一个带有 VC 的应用程序。

在 Mainmenu-VC 中,用户触发 Input-segue。用户在 Input-VC 中输入名字。这会触发 Select-segue 到 Select-VC 以选择姓氏并触发 Selected-segue 到 Details-VC。

用户还可以从 Mainmenu-VC 访问 Details-VC。通过 NavigationControllerMechanism 返回到 Mainmenu-VC。

我想更改 NavigationControllerMechanism 'history',这样当用户通过 Selected-segue 从 Details-VC 进入时,之前的 VC 会从 Select-VC 更改为 Mainmenu-VC。 所以基本上在Details-VC中,Back总是返回Mainmenu-VC。

我尝试结合网络上的各种解决方案,但没有成功。 这可能吗?

【问题讨论】:

【参考方案1】:

是的。

View-Controller 堆栈存储在 currentViewController.navigationController?.viewControllers 中。

所以你应该做这样的事情:

//In Your Details VC :

override func viewDidAppear(_ animated: Bool) 

    super.viewDidAppear(animated)
    guard let stack = self.navigationController?.viewControllers else  return 
    //get the mainMenu VC 
    let mainVC = stack.first!
    // Rearrange your stack
    self.navigationController?.viewControllers = [mainVC, self]

    //Now you can press "bac" to Main VC


【讨论】:

CZ54 - 你能详细说明你的代码是如何工作的吗?我的意思是系统将如何工作。【参考方案2】:

您想以这种方式更改导航堆栈,您可以操作

let myprofile = storyboard.instantiateViewController(withIdentifier: "Profile1ViewController") as! Profile1ViewController
   let sourseStack = self.navigationController!.viewControllers[0];
       var controllerStack = self.navigationController?.viewControllers

        let index = controllerStack!.index(of: sourseStack);
        controllerStack![index!] = myprofile

        self.navigationController!.setViewControllers(controllerStack!, animated: false);

转到 RootViewController

 dispatch_async(dispatch_get_main_queue(), 
                    self.navigationController?.popToRootViewControllerAnimated(true)
                )

【讨论】:

以上是关于导航控制器中的更改顺序的主要内容,如果未能解决你的问题,请参考以下文章

如何更改视图控制器中可访问性元素的顺序而不会失去对导航栏的访问权限?

更改导航栏控制器文本

UIPageViewController 更改导航栏后退按钮标题

如何通过界面生成器更改导航项标题?

导航控制器中的 UISearchBar 和两个按钮

根据选择的选项卡更改导航栏的标题?