从最后一个推送几个ViewControllers和触发器方法,之前解除所有

时间:2016-12-02 10:02:05

标签: ios swift

这是我的问题。

我有ViewController A(让我们只调用它A)。
我从A推送到B,这是自定义相机控制器。 当我拍照时,我呈现模态控制器C,它有两个按钮,一个用于确认,一个用于返回。
如果点击后退按钮,它将返回B控制器。
如果点击了确认按钮,C应该触发委托方法A,然后解除CB,但没有动画,因此忽略{{1}不会被注意到。

问题:
1.如何实现上述方案? B需要委派给A,那么如何做到这一点?我也应该使用展开吗?

提醒:A - >推 - > B - >模态 - > C

2 个答案:

答案 0 :(得分:3)

我认为只需将B的参考传递给C控制器

就可以实现相同的功能

控制器B代码

class BViewController: UIViewController {

    weak var controllerA : ViewController!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func confirmEventCallFromC() {
        self.navigationController?.popViewController(animated: false)
    }

    @IBAction func btnClick(_ sender: Any) {
         self.performSegue(withIdentifier: "CVC", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "CVC" {
            let vc = segue.destination as! CViewController
            vc.controllerB = self
        }

    }

}

Controller C Code就像这样

class CViewController: UIViewController {

    weak var controllerB : BViewController!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func confirmBtnClick(_ sender: Any) {
        controllerB.confirmEventCallFromC()
        self.dismiss(animated: true, completion: nil)
    }

}

我希望这会对你有所帮助。

答案 1 :(得分:2)

您可以使用UnwindSegue,

您可以将VC A中的方法声明为

@IBAction func unWindToVCA(segue : UIStoryboardSegue) {

}

在VC C故事板中,您可以控制从viewController拖动到退出,并且您将弹出一个弹出窗口,其中包含您之前声明的所有展开segue的列表。选择unWindToVCA。

现在选择segue并为其分配一个可重复使用的标识符,如下图所示:)

enter image description here

最后,只要您想返回VC1,请致电

self.performSegue(withIdentifier: "backToVC1", sender: nil)

现在在VCA中,您可以使用

从VC C获取数据
@IBAction func unWindToVCA(segue : UIStoryboardSegue) {
       let c = segue.source
       //access c's data and update A
}

我也遵循了VC的等级制度 VC A - >推VC B - >模态 - > VC C