繁体   English   中英

如何将数据从模态呈现的 ViewController 传递到 swift 5 中的父 ViewController?

[英]How to pass the data from modally presented ViewController to parent ViewController in swift 5?

我在按钮单击时从第一个视图 controller 有两个视图控制器,我以模态方式显示另一个视图控制器。 我不确定如何将数据从模态视图控制器传递到父视图控制器。

哪种方法最好、最干净?

感谢帮助。

我指的是 parentVC 和presentedVC 的答案。 您可以将闭包传递给presentedVC,以便稍后在它有数据时执行,也可以使用委托模式与parentVC通信。 这两种方法各有利弊:

1.闭包:

如果您只需要从presentedVC 将数据传递给parentVC 一次,这种方法就很有用。 首先像这样在presentedVC中定义一个公共闭包。 我在这里假设您需要将 [String: String] 类型的字典发送回 parentVC。

class PresentedVC : UIViewController {
   var closure : (([String: String]) -> Void)?
}

现在,当您初始化presentedVC 并在parentVC 上模态显示它时,您需要指定您需要对收到的字典执行什么操作。 通过 parentVC 像这样:

//Initialise presentedVC

presentedVC.closure = { (dict) in
    //Make parentVC do something with the dictionary
}
//present it modally 

在此之后,当您想与 parentVC 通信时,您只需要从presentedVC 执行此闭包。 请记住正确使用弱引用以不创建保留循环。

2.委托模式:

当有一个 stream 事件想要传回给 parentVC 而不是像上面那样只有一个事件时,这种方法很有用。 首先,我们需要定义一个协议。再次,我假设您需要将类型为 [String: String] 的字典发送回 parentVC。

protocol PresentedVCCallbacks {
  func didStartDataGathering()
  func didCompleteDataGathering(data:[String: String])
}

您需要 parentVC 来实现此协议并在您展示它时在您的presentedVC中定义一个委托:

//Initialise presentedVC
presentedVC.delegate = parentVC
//present it modally 

现在只需在需要时使用此委托与 parentVC 进行通信:

//Lets assume we have a dictionary prepared at a point in presentedVC which needs to be sent to parentVC
delegate.didCompleteDataGathering(data:data)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM