You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UIKit+Storyboard下如何通过双层协议委托实现ThirdVC向FirstVC传值?

UIKit委托链实现ThirdVC到FirstVC的数据传递

你的代码思路方向正确,但存在几个关键问题导致数据无法正常传递,以下是修正后的完整实现方案:

核心问题梳理

  1. 委托属性未用weak修饰,易引发循环引用
  2. FirstVC中存在冗余的delegate属性
  3. ThirdVC调用委托方法时使用了未定义的变量
  4. 委托方法调用时机错误,需在页面跳转前完成数据传递

修正后的完整代码

// 给协议添加类约束,支持weak委托修饰
protocol FirstCall: AnyObject {
    func firstFunction(makerData: String, featuresData: [String])
}

class FirstVC: UIViewController, FirstCall {

    @IBAction func buttonClicked(_ sender: Any) {
        guard let secondVC = storyboard?.instantiateViewController(identifier: "SecondVC") as? SecondVC else { return }
        secondVC.delegate = self
        navigationController?.pushViewController(secondVC, animated: true)
    }
    
    // 实现协议方法,接收并处理传递来的数据
    func firstFunction(makerData: String, featuresData: [String]) {
        print("厂商数据:\(makerData)")
        print("特性列表:\(featuresData)")
    }
}

protocol SecondCall: AnyObject {
    func secondFunction(makerData: String, featuresData: [String])
}

class SecondVC: UIViewController, SecondCall {
    // weak修饰委托,避免循环引用
    weak var delegate: FirstCall?
            
    @IBAction func buttonClicked(_ sender: Any){
        guard let thirdVC = storyboard?.instantiateViewController(identifier: "ThirdVC") as? ThirdVC else { return }
        thirdVC.delegate = self
        navigationController?.pushViewController(thirdVC, animated: true)
    }
    
    // 实现协议方法,将数据转发给FirstVC
    func secondFunction(makerData: String, featuresData: [String]) {
        delegate?.firstFunction(makerData: makerData, featuresData: featuresData)
    }
}

class ThirdVC: UIViewController {
    weak var delegate: SecondCall?
    // 定义要传递的实际数据(可根据业务逻辑动态赋值)
    private let makerData = "Apple"
    private let featuresData = ["Face ID", "A17 Pro", "USB-C"]
    
    @IBAction func buttonClicked(_ sender: Any) {
        // 先传递数据,再执行页面跳转
        delegate?.secondFunction(makerData: makerData, featuresData: featuresData)
        navigationController?.popToRootViewController(animated: true)
    }
}

关键修改说明

  • 给协议添加AnyObject约束,确保委托属性能用weak修饰,避免VC间循环引用
  • 移除FirstVC中冗余的delegate属性,FirstVC本身是协议实现者,无需持有自身委托引用
  • 在ThirdVC中定义实际要传递的数据变量,保证调用委托方法时传入有效数据
  • 调整ThirdVC方法调用顺序:先通过委托链传递数据,再执行页面跳转,确保数据在页面销毁前完成传递

内容的提问来源于stack exchange,提问作者Ayaan Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:54:15