使用 dismiss 在 ViewController 之间传递数据

Pass data between ViewControllers using dismiss

我有 3 ViewControllers A B C。 A和BViewControllers使用C获取数据。 A 和 B 都有一个 select 按钮,因此如果用户在 A ViewController 上并按下 select,则会对 C 执行 segue,用户 selects 数据存储在 a字典按下完成并执行 segue 以返回到 A,并使用 prepare for segue 将字典发送回。如果用户在 B ViewController.

上则完全相同

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

来自 C ViewController 的代码

@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

    }
}

内部 doneBtnPressed 如果您不使用 navigationController

,请使用下面的内容
self.dismiss(animated: true, completion: nil)

如果您使用 navigationController

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

准备 segue 看起来很好

您可以使用像 mySelectedViewController 这样的全局变量名称,并在每次执行按钮操作时设置它的值,例如当您单击 from ViewController A set mySelectedViewController = viewA 然后 in C ViewController 检查 mySelectedViewController 值并根据它工作。

在 C 控制器中创建

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)