使用dismiss在ViewControllers之间传递数据

时间:2017-06-28 08:28:12

标签: ios uiviewcontroller segue unwind-segue

我有3个ViewControllers A B C. A和B ViewControllers使用C来获取数据。 A和B都有一个选择按钮,因此如果用户在A ViewController上并按下选择,则对C执行segue,用户选择存储在按下的字典中的数据,并执行segue以返回A并且字典被发回使用准备segue。如果用户在B ViewController上,则完全相同。

问题 如何让C知道哪个ViewController将字典发送回去。 是他的一种方式,我可以使用dismiss将字典发送回用户来自的ViewController或者更好的方式。

来自C ViewContrller的代码

@IBAction func doneBtnPressed(_ sender: Any) {
    performSegue(withIdentifier: "backToAddMeetingVC", sender: self)

    //Cant work cuz cant perform 2 segues at once
    performSegue(withIdentifier: "backToProjectVC", sender: <#T##Any?#>)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "backToAddMeetingVC" {
        let destination = segue.destination as! AddMeetingVC
        destination.selectedMembers = self.selectedMembers
    }

    if segue.identifier == "backToProjectVC" {
        let destination = segue.destination as! ProjectsVC
        destination.selectedMembers = self.selectedMembers

    }
}

3 个答案:

答案 0 :(得分:2)

在C controller create

var dismissClosure: ((neededData) -> Void)?

在提交C的控制器中,其控制器(B)在prepareSegue中需要声明:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let controller = segue.destination as! C
    controller.dismissClosure = { [weak self] neededData in
        guard let `self` = self else { return }
        //TODO YOUR CHANGES
    }
}

当您解除或弹出控制器时,在C控制器中调用此块

驳回:

dismiss(true) {
   dismissClosure?(neededData)
}

弹出

dismissClosure?(neededData)
navigationController?.popViewController(animated: true)

答案 1 :(得分:0)

如果您未使用doneBtnPressed

,请在下面使用navigationController
self.dismiss(animated: true, completion: nil)

OR

如果您使用navigationController

,请使用以下行
self.navigationController?.popViewController(animated: true)

准备segue看起来很好

答案 2 :(得分:0)

您可以使用全局变量名称mySelectedViewController,并在执行按钮操作时设置其值,例如从ViewController A设置mySelectedViewController = viewA然后在C ViewController中点击检查mySelectedViewController值并按照它工作。