双 return 到上一个视图 - Swift

Double return to previous view - Swift

我是 IOS 和 Swift 的新手,所以不要判断解决方案是否容易。

我有三个 ViewControllers,比如 A、B 和 C。

我从 A -> NavigationController -> B -> NavigationController -> C

开始

在特定情况下,我需要从C 回到A 而看不到B。有什么办法可以做到这一点?

也许改变父导航控制器?也许我可以打印每个当前视图的堆栈? - 这真的很有帮助。 我试着一个一个地关闭 C 和 B 视图,它起作用了,但我们可以暂时看到 B 视图——所以这对我来说不是一个解决方案。 P.s :我正在使用模态类型在控制器之间切换。

enter image description here

如果 A 总是第一个视图控制器,你可以这样做:

viewcontrollerC.navigationController?.popToRootViewController(animated: true)

此方法将堆栈弹出到第一个视图控制器,而不显示中间视图控制器

如果A不是第一个viewController,你可以这样做:

viewcontrollerC.navigationController?。 popToViewController(viewControllerA, animated: true)

如果您没有对 viewControllerA 的引用,请在堆栈中搜索它:

let viewControllerA: UIViewController? 

for (let vc in (self.navigationController?.viewControllers ?? [])) {
     //adust the test to find the appropriate controller
    if vc.isKindOf(ViewControllerAClass.self) {
          viewControllerA = vc
          break  
    }
}

if let viewControllerA = viewControllerA {
    self.navigationController?.popToViewController(viewControllerA, animated: true)
}

来源:https://developer.apple.com/documentation/uikit/uinavigationcontroller/1621871-poptoviewcontroller

您可以通过两种方式实现这一目标。实现起来很简单,在View Controller C中可以,在特定情况下,调用如下函数:

navigationController?.popToRootViewController(animated: true)

这将弹出所有导航视图层次结构并带您回到根,即第一个视图控制器。

第二种方法是在要返回的视图控制器中定义展开方法。在视图控制器中,当您开始键入 unwind 时,在 Xcode 10 中,您将获得自动完成以添加此 Swift Unwind Segue 方法。

@IBAction func unwindToA(_ unwindSegue: UIStoryboardSegue) {
    let sourceViewController = unwindSegue.source
    // Use data from the view controller which initiated the unwind segue
}

在这个特定的问题中,假设您在视图控制器 A 中添加了此方法,因为您想返回它。我假设你在 View Controller C 上有一个返回 A 的按钮。Controll+从按钮拖动到 View Controller A 的 Exit 符号。unwindToA 方法将自动弹出。连接到它,你就完成了。当用户按下这个按钮时,它将返回 2 个导航控制器到 A.

注意:通过这种方法,您可以返回到导航堆栈上的任何导航控制器,而不仅限于根视图控制器。下面我是显示视图控制器上的出口的附加图片。