Ios 当导航栏';s内置的后退按钮被按下

Ios 当导航栏';s内置的后退按钮被按下,ios,swift,uinavigationcontroller,uinavigationbar,Ios,Swift,Uinavigationcontroller,Uinavigationbar,每当按下俯视图控制器上的“后退”按钮时,我都希望返回到不是上一个视图控制器的特定视图控制器。我希望有一种方法可以以某种方式覆盖后退按钮的功能 编辑: 我让这个工作: self.navigationController?.popToRootViewController(动画:true) 唯一的问题是,在设置动画时,它会将中间视图控制器显示为其指向根 阅读您编辑的问题,似乎您要查找的是在导航堆栈中弹出回根视图控制器,而不显示动画中的任何视图控制器 通过从堆栈中删除所有中间视图控制器,可以轻松实现这一

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

编辑:

我让这个工作:

self.navigationController?.popToRootViewController(动画:true)


唯一的问题是,在设置动画时,它会将中间视图控制器显示为其指向根

阅读您编辑的问题,似乎您要查找的是在导航堆栈中弹出回根视图控制器,而不显示动画中的任何视图控制器

通过从堆栈中删除所有中间视图控制器,可以轻松实现这一点

在上次显示的视图控制器的
viewDidLoad
方法中,执行以下操作:

func viewDidLoad() {
    super.viewDidLoad()
    if let rootVC = navigationController?.viewControllers.first {
        navigationController?.viewControllers = [rootVC, self]
    }
}
然后,当点击后退按钮时,导航控制器将关闭返回根目录的当前视图控制器。

基于:

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

要在没有动画的情况下实现pop,应执行以下操作:

  • 访问viewControllers属性,该属性是UINavigationController堆栈,但您可以从此数组中的每个位置弹出。 var viewControllers:[UIViewController] 当前位于导航堆栈上的视图控制器

例如:

yourViewController.navigationController.viewControllers = [specificVC,self]
  • 最好创建一个扩展名,并在任何地方调用它:
实施: 用法:
还有一个问题。当我这样做时,它似乎覆盖了我设置的后退按钮文本。我试图通过将后退按钮文本添加到viewDidLoad()中来重置后退按钮文本,但仍不起作用。显示最终视图控制器时,后退按钮标题应与根视图控制器的标题匹配。您可以在根视图控制器的
viewDidLoad
中使用
navigationItem.title=“My title”
进行设置。
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)