当导航栏的内置返回按钮被按下时,弹回到根视图控制器。

3
每当我在顶层视图控制器上按下返回按钮时,我想要返回到一个特定的视图控制器,而不是上一个视图控制器。我希望有一种方法可以以某种方式覆盖返回按钮的功能。
编辑:
我用以下代码使其正常工作:
self.navigationController?.popToRootViewController(animated: true)
唯一的问题是,在它动画时,它显示中间的视图控制器,因为它去根视图控制器。
2个回答

10

阅读您编辑后的问题,似乎您要做的是在导航堆栈中弹回到根视图控制器,而不会显示任何中间视图控制器的动画。

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

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

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

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


只有一个问题。当我这样做时,它似乎会覆盖我设置的返回按钮文本。我尝试通过在viewDidLoad()中添加来重置返回按钮文本,但仍然不起作用。 - mikew
当呈现最终视图控制器时,返回按钮标题应与根视图控制器的标题匹配。您可以在根视图控制器的viewDidLoad中使用navigationItem.title = "My title"进行设置。 - Eneko Alonso

1

根据苹果开发者文档

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

要实现无动画弹出,请执行以下操作:

  • 访问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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接