Swift 5中如何将模态ViewController的数据传递给父ViewController?
嘿,这个问题我刚学iOS的时候也纠结过!给你分享两种最常用也最简洁的实现方法,按需选就行~
方法一:闭包(Closure)—— 简单场景首选
这种方式不用额外定义协议,代码量少,适合只需要一次数据传递的简单场景。
在模态ViewController里定义闭包属性
先在你的第二个VC(比如命名为ModalViewController)里声明一个闭包,用来承载数据传递的逻辑:class ModalViewController: UIViewController { // 闭包参数根据你要传递的数据类型调整,比如这里用String var onDataPass: ((String) -> Void)? // 假设点击确认按钮时触发数据传递 @IBAction func confirmButtonTapped(_ sender: UIButton) { // 获取要传递的内容,比如输入框文本 let transferData = "这是从模态VC传过来的数据" // 调用闭包传递数据 onDataPass?(transferData) // 关闭模态页面 dismiss(animated: true) } }在父ViewController里绑定闭包逻辑
当你在第一个VC(比如ParentViewController)中present模态VC时,给闭包赋值,接收传递过来的数据:class ParentViewController: UIViewController { @IBAction func showModalVC(_ sender: UIButton) { let modalVC = ModalViewController() // 绑定闭包,注意加[weak self]避免循环引用 modalVC.onDataPass = { [weak self] receivedData in // 这里处理收到的数据,比如更新UI或者存储 print("父VC收到数据:\(receivedData)") self?.resultLabel.text = receivedData } present(modalVC, animated: true) } }
方法二:代理(Delegate)—— 复杂交互更清晰
如果你的模态VC和父VC之间有多个交互事件需要传递,代理模式会让代码结构更清晰,符合iOS的设计规范。
定义代理协议与属性
在ModalViewController里先定义一个代理协议:// 定义代理协议 protocol ModalViewControllerDelegate: AnyObject { func modalVC(_ vc: ModalViewController, didSendData data: String) } class ModalViewController: UIViewController { // 代理属性必须用weak修饰,避免循环引用 weak var delegate: ModalViewControllerDelegate? @IBAction func confirmButtonTapped(_ sender: UIButton) { let transferData = "通过代理传递的数据" // 调用代理方法传递数据 delegate?.modalVC(self, didSendData: transferData) dismiss(animated: true) } }父ViewController遵守并实现代理
在ParentViewController中遵守协议,实现对应的代理方法:class ParentViewController: UIViewController, ModalViewControllerDelegate { @IBAction func showModalVC(_ sender: UIButton) { let modalVC = ModalViewController() modalVC.delegate = self present(modalVC, animated: true) } // 实现代理方法,处理传递过来的数据 func modalVC(_ vc: ModalViewController, didSendData data: String) { print("通过代理收到数据:\(data)") resultLabel.text = data } }
小总结
- 只是单次简单数据传递?选闭包,代码更轻量化。
- 有多个交互事件或需要更清晰的代码结构?选代理,扩展性更强。
内容的提问来源于stack exchange,提问作者New iOS Dev




