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

如何通过Protocol在Cell类中调用ViewController的函数?

关于Cell类调用ViewController中xyz函数的协议实现验证与指导

嘿,我来帮你梳理下这个协议实现的问题~你的思路是对的,用Delegate模式(协议)实现跨类调用是iOS开发里的常规操作,但现有代码有几个小细节需要调整才能正常工作:

现有代码的问题点

  • Cell类代码不完整:缺少类定义,delegate属性也没有放在类内部
  • 未处理循环引用风险:如果不使用weak修饰delegate,可能会导致ViewController和Cell互相持有无法释放
  • 协议未声明为类专属:最好限制只有类类型能遵守协议,避免值类型带来的问题

修正后的完整代码

ViewController代码

import UIKit

// 声明为类专属协议,确保只有引用类型能遵守
protocol abc: AnyObject {
    func xyz()
}

class ViewController: UIViewController, abc {
    func xyz() {
        print("Hi")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let obj = Cell()
        obj.delegate = self
        // 可调用update方法测试效果
        obj.update()
    }
}

Cell类代码

import UIKit

// 假设Cell是UITableViewCell子类,可根据实际场景调整父类
class Cell: UITableViewCell {
    // 用weak修饰delegate,避免循环引用
    weak var delegate: abc?
    
    func update() {
        self.delegate?.xyz()
    }
}

补充说明

  1. 类专属协议:给协议加上: AnyObject后,只有类(比如ViewController这种引用类型)能遵守,这样我们才能安全地用weak修饰delegate
  2. weak修饰符:ViewController持有Cell实例,Cell的delegate又持有ViewController,如果不用weak,就会形成循环引用,导致两个对象都无法被ARC回收
  3. 实际场景适配:如果这个Cell是UITableView的单元格,通常不会在viewDidLoad里直接初始化,而是在tableView(_:cellForRowAt:)方法中复用,拿到Cell实例后设置delegate = self即可

这样调整后,当Cell调用update()方法时,就能正确触发ViewController里的xyz()方法,打印出"Hi"啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:35:29