从 NavigationController 后退按钮返回多个 ViewController

Posted

技术标签:

【中文标题】从 NavigationController 后退按钮返回多个 ViewController【英文标题】:Go back multiple ViewControllers from NavigationController back button 【发布时间】:2019-09-02 15:23:51 【问题描述】:

当我单击 NavigationController 上的后退按钮时,我想返回两个 ViewController 而不是一个。

  override func viewWillDisappear(_ animated: Bool)
    
        super.viewWillDisappear(animated)

        if self.isMovingFromParent
        
            let vc = self.navigationController?.viewControllers[1] as! MyViewController

            self.navigationController?.popToViewController(vc, animated: false)
        
    

这几乎是我想要的方式。更改 self.navigationController?.viewControllers[1] 可以让我转到堆栈中的任何 ViewController。我唯一的问题是它总是在直接进入我弹出的 ViewController 之前短暂地显示最顶层的 viewController。如何阻止它显示中间 ViewController?

我的问题是:

VC[0] → VC[1] → 风险投资[2] → VC[3]

从 3 我想直接返回到 1 而不必显示 2。我想从 NavigationController 后退按钮执行此操作。

【问题讨论】:

【参考方案1】:

如果堆栈中有 viewController,则可以使用类名返回到它。

let viewControllers: [UIViewController] = self.navigationController!.viewControllers ;
for aViewController in viewControllers 
    if(aViewController is HomeViewController)
       self.navigationController!.popToViewController(aViewController, animated: true);
    

【讨论】:

谢谢,但我认为这与我的解决方案没有太大区别。我的问题是 NavigationController 返回会暂时显示堆栈中最顶层的 ViewController,这是我试图避免的。【参考方案2】:

您可以为此使用展开转场

尝试将此代码放入您要返回的UIViewController

@IBAction func unwindHere(segue:UIStoryboardSegue) 

转到情节提要并查找要返回的视图控制器(在您的情况下为 VC3),然后 CTRL + 拖动 视图控制器图标退出图标强>。这将显示unwindHere

在 VC3 的左侧面板中选择 unwindHere unwind segue 为其指定一个标识符名称,例如unwindSegueToVC1

创建一个函数,该函数将使用标识符名称执行 segue,以展开到您想要的视图控制器 (VC1)

override func viewDidLoad() 
    super.viewDidLoad()

    setupNavigationBar()



@objc func unwindToFirstViewController()      
     performSegue(withIdentifier: "unwindSegueToVC1", sender: self)


func setupNavigationBar() 

    self.navigationController?.navigationItem.leftBarButtonItem?.action = #selector(unwindToFirstViewController)


【讨论】:

设置一个新的 NavigationBarButton 是可行的,但它会更改后退按钮的样式以删除 尝试在setupNavigationBar函数中只使用self.navigationController?.navigationItem.leftBarButtonItem?.action = #selector(unwindToFirstViewController)

以上是关于从 NavigationController 后退按钮返回多个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

iOS 禁用 NavigationController 后退按钮的动画

iOS 5中缺少navigationController栏后退按钮

添加NavigationController不会显示后退按钮

保留图标,从“后退”按钮中删除文本

从保留图标的后退按钮中删除文本

Swift - 如何从 NavigationController 中删除视图控制器?