两次返回上一个视图-Swift

时间:2018-12-11 15:17:26

标签: ios swift xcode uinavigationcontroller viewcontroller

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

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

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

开始

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

也许要更改父NavigationController吗?也许我可以在每个当前视图下打印堆栈? -真的很有帮助。 我尝试逐一消除C和B视图,但可以,但是稍后我们可以看到B视图-因此这对我来说不是解决方案。 附言:我正在使用Modal类在控制器之间进行切换。

enter image description here

2 个答案:

答案 0 :(得分:1)

如果A始终是第一个视图控制器,则可以执行以下操作:

viewcontrollerC.navigationController?.popToRootViewController(animated: true)

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

如果A不是第一个viewController,则可以执行以下操作:

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

答案 1 :(得分:0)

有两种方法可以实现此目的。易于实现的是在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方法将自动弹出。连接到它就完成了。当用户按下此按钮时,它将使两个导航控制器返回到A。

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