首页 文章

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

提问于
浏览
1

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

  • VC1 --Opens--> VC2: vc2是一个显示Form的viewcontroller . 在正确填充时,用户被带到另一个VC . 称之为vC3

  • VC2 --Opens--> VC3: vc3是一个视图控制器,可以获取刷卡信息,如果提供的信息正确,则需要VC4

  • VC3 --Opens--> VC4: .

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

那么处理这种情况最好的是什么呢 . 请建议 .

UPDATE:

我正在使用Tab bar控制器,在该View之一的控制器下,我正在打开其他的VIew控制器 . 就像这个打开VC3的Open VC2一样......

This is how I am showing my ViewController 2

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

2 回答

  • 0

    你可以用各种方式做,一个如下: -

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

    NavigationController - > VC1 - > VC2 - > VC3 - > VC4(使用push) . 现在使用下面的代码更改你的控制器

    如果pop到root使用: -

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

    如果对于pop进入VC3只需弹出到root .

    我希望它能帮助你,

    谢谢

  • 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将被解除 . 显然,您也可以将此方法放入其他视图控制器中 .

相关问题