以编程方式返回到Swift中连续的第3个先前的ViewController

时间:2018-12-10 06:45:18

标签: ios swift uiviewcontroller

关于如何返回到以前的View控制器,我看到了太多的话题,这很有意义,也很容易实现。但就我而言,只有一种类型的并发症。考虑以下情况。

  • VC1-打开-> VC2: vc2是显示窗体的视图控制器。正确填充后,用户将被带到另一个VC。称为vC3
  • 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) 

3 个答案:

答案 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)
      }
}