关于如何返回到以前的View控制器,我看到了太多的话题,这很有意义,也很容易实现。但就我而言,只有一种类型的并发症。考虑以下情况。
VC2-打开-> VC3: vc3是一种视图控制器,可获取刷卡信息,如果提供的信息正确,则将其带到VC4
VC3-打开-> VC4:。
VC4是加载所有用户联系人并发送的ViewController 所选联系人的信息/数据。到目前为止,一切都很好。现在 有2种情况,如果我发送的数据正确发送,则 我必须直接回到VC1,如果没有发送数据,那么我 必须直接回到vc2才能再次获取信息。
那么处理这种情况的最佳方法是什么。请提出建议。
更新:
我正在使用Tab栏控制器,在该View之一下的那个控制器中,我正在从此系列中打开其他VIew控制器。就像从此VC2打开VC3一样,等等...
这就是我显示ViewController 2的方式
let myVC2 = self.storyboard?.instantiateViewController(withIdentifier: "idMyVC2") as MyVC2
myVC2.modalPresentationStyle = .fullScreen
self.present(myVC2,animated : true)
答案 0 :(得分:1)
将其插入操场并弄乱它:
import UIKit
protocol DismissDelegate: AnyObject {
func dismissVC(_ presenting: Int)
}
class VC1: UIViewController, DismissDelegate {
func dismissVC(_ presenting: Int) {
guard presenting == 1 else {
return
}
print("dismiss 2, 3, 4, 5")
}
}
class VC2: UIViewController, DismissDelegate {
weak var vc2Delegate: DismissDelegate?
func dismissVC(_ presenting: Int) {
guard presenting == 2 else {
return vc2Delegate!.dismissVC(presenting)
}
print("dismiss 3, 4, 5")
}
}
class VC3: UIViewController, DismissDelegate {
weak var vc3Delegate: DismissDelegate?
func dismissVC(_ presenting: Int) {
guard presenting == 3 else {
return vc3Delegate!.dismissVC(presenting)
}
print("dismiss 4, 5")
}
}
class VC4: UIViewController, DismissDelegate {
weak var vc4Delegate: DismissDelegate?
func dismissVC(_ presenting: Int) {
guard presenting == 4 else {
return vc4Delegate!.dismissVC(presenting)
}
print("dismiss 5")
}
}
class VC5: UIViewController {
weak var vc5Delegate: DismissDelegate?
func dismissStack(at presenting: Int) {
vc5Delegate?.dismissVC(presenting)
}
}
let vc1 = VC1()
let vc2 = VC2()
vc2.vc2Delegate = vc1
let vc3 = VC3()
vc3.vc3Delegate = vc2
let vc4 = VC4()
vc4.vc4Delegate = vc3
let vc5 = VC5()
vc5.vc5Delegate = vc4
vc5.dismissStack(at: 1) // prints: dismiss 2, 3, 4, 5
vc5.dimissStack(at: 2) // prints: dismiss 3, 4, 5
该设置非常基础,每个视图控制器都通过一个委托链接。因为有多个视图控制器,所以我们创建了一个协议。该协议只是采用整数参数的方法,该参数是应执行关闭操作的视图控制器(当前视图控制器)。然后,当您要执行解散时,调用委托(不必来自第5个视图控制器),指定呈现的视图控制器,然后该代理会沿着链式检查并检查是否为呈现的视图控制器(如果是的,它是否会忽略其上方的所有内容)(否则,则将退出一个视图控制器并重复该过程)。
VC5
有一个名为dismissStack(at:)
的方法,您可以将要关闭的视图控制器的整数放入其中。因此,如果您在2处解雇,则视图控制器3、4、5将被解雇。显然,您也可以将此方法放置到其他视图控制器中。
答案 1 :(得分:0)
您可以通过多种方式进行操作,如下所示:-
视图控制器的层次结构类似于:-
NavigationController-> VC1-> VC2-> VC3-> VC4(使用push)。现在使用下面的代码更改您的控制器
如果弹出根目录,请使用:-
for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: VC1) {
self.navigationController!.popToViewController(controller, animated: true)
break
}
}
如果要弹出VC3,只需弹出根即可。
希望它会对您有所帮助,
谢谢
答案 2 :(得分:0)
我最常使用的方式是
for controller in self.navigationController.controllers {
if let desiredVC = controller as? DesiredViewControllerName {
self.navigationController!.popToViewController(desiredVC, animated: true)
}
}