You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift 5中如何将模态ViewController的数据传递给父ViewController?

嘿,这个问题我刚学iOS的时候也纠结过!给你分享两种最常用也最简洁的实现方法,按需选就行~

方法一:闭包(Closure)—— 简单场景首选

这种方式不用额外定义协议,代码量少,适合只需要一次数据传递的简单场景。

  1. 在模态ViewController里定义闭包属性
    先在你的第二个VC(比如命名为ModalViewController)里声明一个闭包,用来承载数据传递的逻辑:

    class ModalViewController: UIViewController {
        // 闭包参数根据你要传递的数据类型调整,比如这里用String
        var onDataPass: ((String) -> Void)?
        
        // 假设点击确认按钮时触发数据传递
        @IBAction func confirmButtonTapped(_ sender: UIButton) {
            // 获取要传递的内容,比如输入框文本
            let transferData = "这是从模态VC传过来的数据"
            // 调用闭包传递数据
            onDataPass?(transferData)
            // 关闭模态页面
            dismiss(animated: true)
        }
    }
    
  2. 在父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的设计规范。

  1. 定义代理协议与属性
    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)
        }
    }
    
  2. 父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

火山引擎 最新活动