繁体   English   中英

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

[英]Programmatically go back to consecutive 3rd previous ViewController in Swift

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

  • VC1 --Opens--> VC2: vc2是一个显示表单的视图控制器 正确填写后,用户将被带到另一个 VC。 称之为 vC3
  • VC2 --Opens--> VC3: vc3 是一个视图控制器,它获取刷卡信息,如果提供的信息正确,则需要到 VC4

  • VC3 --打开--> VC4:。

VC4 是加载所有用户联系人并向所选联系人发送信息/数据的视图控制器。 到目前为止还好。 现在有2个条件,如果我发送的数据正确发送,那么我必须直接回到VC1,如果没有发送数据,我必须直接回到vc2再次获取信息。

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

更新:

我正在使用 Tab bar 控制器,在那个 View 下的那个控制器中,我正在从这个系列中打开另一个 VIew 控制器。 就像从这个 Opening 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

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

VC5有一个叫做dismissStack(at:)的方法dismissStack(at:)它可以让你输入一个你想要关闭的视图控制器的整数。 因此,如果您在 2 处关闭,则视图控制器 3、4、5 将被关闭。 显然,您也可以将此方法放入其他视图控制器中。

您可以通过多种方式进行,其中一种如下所示:-

视图控制器的层次结构类似于:-

NavigationController -> VC1 -> VC2 -> VC3 -> VC4(使用推送)。现在使用下面的代码来改变你的控制器

如果弹出到 root 使用:-

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

如果要在 VC3 上弹出,只需弹出到根目录。

我希望它会帮助你

谢谢

这是我使用的一种方式

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

我最常用的方式是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM