【问题标题】:Pass data between ViewControllers using dismiss使用dismiss在ViewControllers之间传递数据
【发布时间】:2017-12-01 12:22:24
【问题描述】:

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

问题 我如何让 C 知道将字典发送回哪个 ViewController。 他们是我可以使用驳回将字典发送回用户来自的 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

    }
}

【问题讨论】:

标签: ios uiviewcontroller segue unwind-segue


【解决方案1】:

在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)

【讨论】:

  • 我解决了这个问题,但现在我收到了 2 个新错误“无法插入 COPY_SEND”和“无法取消分配发送权”,而且dismissClosure 为空,它没有获取所需的数据
  • 也许您正在使用不在主线程 Example 中的 UI。当然,在块中只使用弱自引用(我更改了帖子)
  • 好吧,我不明白你的改变,我想做的就是在解雇 C 时从 C 中获取字典到 B 中的字典
  • 在 C 控制器中创建可选闭包,在 B 控制器中的“prepare(for segue)”方法中声明此闭包,因为在出​​现 C 控制器之前称为“prepare(for segue)”并初始化此闭包当你关闭或弹出 C 控制器,调用闭包并将字典放在括号中。 C 的结果将立即到达 B 控制器,在您声明闭包的 B 控制器中,并使用您的字典进行操作。 非常重要 在回调闭包中使用弱自引用,而不是强引用。当您在 UI 中进行更改(例如 pop 和 dismiss)时,请在主线程中进行。
【解决方案2】:

如果你不使用navigationController,请在下面使用doneBtnPressed@

self.dismiss(animated: true, completion: nil)

如果您使用的是navigationController,请使用以下行

self.navigationController?.popViewController(animated: true)

准备转场看起来不错

【讨论】:

    【解决方案3】:

    您可以使用像mySelectedViewController 这样的全局变量名称,并在执行按钮操作时设置其值,例如从ViewController A 设置mySelectedViewController = viewA 然后在C ViewController 检查mySelectedViewController 值并根据给它。

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多