如何通过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() } }
补充说明
- 类专属协议:给协议加上
: AnyObject后,只有类(比如ViewController这种引用类型)能遵守,这样我们才能安全地用weak修饰delegate - weak修饰符:ViewController持有Cell实例,Cell的delegate又持有ViewController,如果不用weak,就会形成循环引用,导致两个对象都无法被ARC回收
- 实际场景适配:如果这个Cell是UITableView的单元格,通常不会在
viewDidLoad里直接初始化,而是在tableView(_:cellForRowAt:)方法中复用,拿到Cell实例后设置delegate = self即可
这样调整后,当Cell调用update()方法时,就能正确触发ViewController里的xyz()方法,打印出"Hi"啦~
内容的提问来源于stack exchange,提问作者Popolok11
相关产品推荐
相关产品推荐

