0

当我单击 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] → VC[2] → VC[3]

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

4

2 回答 2

1

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

let viewControllers: [UIViewController] = self.navigationController!.viewControllers ;
for aViewController in viewControllers {
    if(aViewController is HomeViewController){
       self.navigationController!.popToViewController(aViewController, animated: true);
    }
}
于 2019-09-02T15:38:34.363 回答
0

您可以为此使用 unwind segues

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

@IBAction func unwindHere(segue:UIStoryboardSegue) {}

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

在 VC3 的左侧面板中选择unwindHereunwind 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)

}
于 2019-09-02T15:53:29.863 回答