繁体   English   中英

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

[英]Pop to the root view controller when the navigation bar's built in back button is pressed

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

编辑:

我得到了这个工作:

self.navigationController?.popToRootViewController(animated: true)

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

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

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

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

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

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

基于苹果开发者文档

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

为了在没有动画的情况下实现流行,您应该这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM