以编程方式返回到Swift中连续第三次出现的ViewController



我看到了太多关于如何返回到以前的View控制器的线程,这使得sens也很容易实现。但在我的情况下,只有一种并发症。考虑以下情况。

  • VC1--打开-->VC2:VC2是一个显示窗体的视图控制器。在正确填充后,用户将被带到另一个VC。称之为vC3
  • VC2--打开-->VC3:VC3是一个视图控制器,用于获取刷卡信息,如果提供的信息正确,则会进入VC4

  • VC3—打开-->VC4:

VC4是加载所有用户联系人并发送信息/数据。到目前为止一切都很好。现在有两个条件,如果我发送的数据发送正确,那么我必须直接返回VC1,如果数据没有发送,那么我必须直接返回vc2才能再次获取信息。

那么处理这种情况的最佳方法是什么呢。请提出建议。

更新:

我正在使用选项卡栏控制器,在其中一个视图下的那个控制器中,我正在打开该系列中的另一个View控制器。就像从这个打开VC2打开VC3等等…

这就是我显示ViewController 2的方式

let myVC2 = self.storyboard?.instantiateViewController(withIdentifier: "idMyVC2") as MyVC2 
myVC2.modalPresentationStyle = .fullScreen 
self.present(myVC2,animated : true) 

将其插入操场并乱搞:

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

设置非常基本,每个视图控制器都通过一个代理链接。因为有多个视图控制器,所以我们创建了一个协议。该协议只是一个采用整数参数的方法,该参数是应该执行解除的视图控制器(呈现视图控制器(。然后,当您想要执行驳回时,调用委托(不必来自第五视图控制器(,指定呈现视图控制器,委托将沿着链向下检查它是否是呈现视图控制器(如果是,它将驳回上面的所有内容(或否(如果不是,它将放下一个视图控制器并重复该过程(。

VC5有一个名为dismissStack(at:)的方法,该方法允许您输入要在处解除的视图控制器的整数。因此,如果在2处解除,则视图控制器3、4、5将被解除。很明显,您也可以将此方法放置到其他视图控制器中。

你可以用各种方式来做,其中一种方式如下:-

视图控制器的层次结构如下:-

导航控制器->VC1->VC2->VC3->VC4(使用推送(。现在使用以下代码更改控制器

如果弹出到根使用:-

for controller in self.navigationController!.viewControllers as Array {
if controller.isKind(of: VC1) {
self.navigationController!.popToViewController(controller, animated:    true)
break
}
}

如果是pop,则在VC3转到简单的pop到root。

我希望它能帮助你,

感谢

我使用最多的方法是

for controller in self.navigationController.controllers {
if let desiredVC = controller as? DesiredViewControllerName {
self.navigationController!.popToViewController(desiredVC, animated: true)
}
}

以下是我使用的方法

for controller in self.navigationController!.viewControllers 
{
if let vc = controller as? LoginViewController 
{
self.navigationController!.popToViewController(vc, animated:    true)
break
}
}

最新更新