【问题标题】:Programmatically go back to consecutive 3rd previous ViewController in Swift以编程方式返回到 Swift 中连续第三个之前的 ViewController
【发布时间】:2019-05-11 01:24:36
【问题描述】:

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

  • VC1 --Opens--> VC2: vc2 是一个显示窗体的视图控制器。正确填写后,用户将被带到另一个 VC。称之为 vC3
  • VC2 --Opens--> VC3: vc3 是一个视图控制器,它接收刷卡信息,如果提供的信息正确,它会转到 VC4

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

VC4 是加载所有用户联系人并发送 信息/数据给该选定的联系人。到目前为止还不错。现在 有两个条件,如果我发送的数据是正确发送的 我得直接回到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) 

【问题讨论】:

  • 您是在使用故事板转场,还是想通过直接 UINavigationController pop... 来实现?
  • 你如何呈现来自VC1的VC2,来自VC2的VC3等等?
  • 立即阅读更新的问题
  • 是的......
  • 只需在您呈现的所有视图控制器之间链接委托,并使用它们来关闭您想要返回的视图控制器之上的特定视图控制器。如果A呈现B,B呈现C,C呈现D,D呈现E,如果你通过delegate并dismiss B(从E),它会自动dismiss C,D,E一起,把用户带回A .

标签: ios swift uiviewcontroller


【解决方案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 将被关闭。显然,您也可以将此方法放入其他视图控制器中。

【讨论】:

    【解决方案2】:

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

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

    NavigationController -> VC1 -> VC2 -> VC3 -> VC4(使用推送)。现在使用以下代码更改您的控制器

    如果 pop 到 root 使用:-

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

    如果 for pop go to at VC3 只需弹出到根目录。

    希望对你有帮助

    谢谢

    【讨论】:

    • 我没有导航控制器
    • @ShaartiKAKI 按照你提到的更好的方法。
    【解决方案3】:

    我用得最多的方式是

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

    【讨论】:

      【解决方案4】:

      这是我使用的一种方式

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

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 1970-01-01
        • 2015-10-23
        • 2015-08-16
        • 2020-10-01
        • 1970-01-01
        • 2019-11-14
        • 2014-01-16
        • 1970-01-01
        相关资源
        最近更新 更多