我是IOS和Swift的新手,所以不要判断解决方案是否简单。
我有三个ViewControllers
,例如A,B和C。
我从 A-> NavigationController-> B-> NavigationController-> C
开始在特定情况下,我需要从C返回A而不看到B。有什么方法可以做到这一点?
也许要更改父NavigationController吗?也许我可以在每个当前视图下打印堆栈? -真的很有帮助。 我尝试逐一消除C和B视图,但可以,但是稍后我们可以看到B视图-因此这对我来说不是解决方案。 附言:我正在使用Modal类在控制器之间进行切换。
答案 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。
注意:通过这种方法,您可以返回到导航堆栈上的任何导航控制器,而不仅限于根视图控制器。下面是显示视图控制器上出口的附加图片。