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



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

编辑:

我让这个工作:

self.navigationController?.popToRootViewController(animated: true)

唯一的问题是它正在动画时,它将中间视图控制器显示为扎根。

阅读您的编辑问题,似乎您正在寻找的是弹出回到导航堆栈中的root View Controller,而无需动画介绍任何视图控制器之间的任何视图控制器。

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

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

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

然后,当在返回按钮上点击时,导航控制器将解散当前视图控制器回到根部。

基于Apple开发人员文档:

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

为了在没有动画的情况下实现流行音乐:

  • Access 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)

最新更新