双重返回上一个视图 - Swift

Posted

技术标签:

【中文标题】双重返回上一个视图 - Swift【英文标题】:Double return to previous view - Swift 【发布时间】:2018-12-11 15:17:25 【问题描述】:

我是 ios 和 Swift 新手,所以不要判断解决方案是否简单。

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

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

开始

在特定情况下,我需要在没有看到 B 的情况下从 C 回到 A。有什么办法吗?

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

enter image description here

【问题讨论】:

你能展示一下你是如何展示视图控制器的吗? 每个场景之间添加导航控制器有什么需要? ***.com/questions/40091107/… 【参考方案1】:

如果A 始终是第一个视图控制器,您可以这样做:

viewcontrollerC.navigationController?.popToRootViewController(animated: true)

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

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

viewcontrollerC.navigationController?。 popToViewController(viewControllerA, 动画: 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

【讨论】:

谢谢,但不是,这只是项目的一部分 看起来不错,我确信这会有效,但事实并非如此。我在 self.navigationController?.viewControllers 中只有一个 viewController 你如何展示你的控制器? 请查看以下使用展开转场的解决方案。当然,如果您的所有视图都在导航视图堆栈上,则我的以下答案的这个答案将起作用。这意味着您使用 Show segue 类型来呈现它们,而不是像 Present Modally 或 Present as Pop Over 这样的任何其他类型。【参考方案2】:

有两种方法可以实现这一目标。实现起来很简单,在 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

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

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

【讨论】:

以上是关于双重返回上一个视图 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3返回上一个视图控制器

JSQ 消息视图控制器:在导航栏上添加“返回”按钮和图像,Swift

ARC奇怪的双重释放?

如何强制返回按钮转到第一个视图控制器(swift)

使用 swift 4 退出应用程序并返回主屏幕

初始视图控制器标题更改为“返回”Swift