按下导航栏内置的后退按钮时,弹出到根视图控制器

时间:2017-09-07 02:45:51

标签: ios swift uinavigationcontroller uinavigationbar

每当我的顶视图控制器上按下后退按钮时,我想返回到不是前一个视图控制器的特定视图控制器。我希望有一种方法可以某种方式覆盖后退按钮的功能。

编辑:

我让这个工作:

self.navigationController?.popToRootViewController(animated: true)

唯一的问题是因为它是动画,它显示中间视图控制器作为它的根目录。

2 个答案:

答案 0 :(得分:4)

阅读您编辑过的问题,您正在寻找的是回弹到导航堆栈中的根视图控制器,而动画中没有任何视图控制器。

您可以通过从堆栈中删除所有这些中间视图控制器来轻松实现此目的。

在上次显示的视图控制器的viewDidLoad方法中执行:

func viewDidLoad() {
    super.viewDidLoad()
    if let rootVC = navigationController?.viewControllers.first {
        navigationController?.viewControllers = [rootVC, self]
    }
}

然后,当点击后退按钮时,导航控制器将关闭当前视图控制器返回根目录。

答案 1 :(得分:0)

基于apple developer documentation

  

导航控制器对象使用有序数组(称为导航堆栈)来管理其子视图控制器。数组中的第一个视图控制器是根视图控制器,它表示堆栈的底部。数组中的最后一个视图控制器是堆栈中最顶层的项,它表示当前正在显示的视图控制器。 您可以使用segue或此类的方法从堆栈中添加和删除视图控制器

要获得没有动画的流行效果,您应该这样做:

  • 访问viewControllers属性,该属性是UINavigationController堆栈,但是您可以从此数组的每个位置弹出,甚至从顶部弹出!
      

    var viewControllers:[UIViewController]   当前在导航堆栈上的视图控制器。

示例:

yourViewController.navigationController.viewControllers = [specificVC,self]
  • 最好创建一个扩展名并在任何需要的地方调用它:

实施:

import UIKit

extension: UIViewController {

    func setNext(to root: UIViewController? = nil) {
        guard let navigation = self.navigationController,
            let first = navigation.viewControllers.first else {return}
        if let root = root {
            navigation.viewControllers = [root,self]
        }else{
            navigation.viewControllers = [first,self]
        }
    }
}

用法:

self.setNext(to: specificVC)