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

iOS开发:委托模式传递Bar对象至InfoViewController失效问题排查

问题分析与解决方案

嘿,我一眼就看出问题出在哪了——你的代理设置时机和对象完全搞反了,导致代理方法根本没被正确调用,所以infoBar一直是nil。

核心错误点

你在ListViewController的didSelectRowAt方法里,实例化infoVC之后就立刻调用了chooseBarDelegate?.chooseBar(barChosen: barSelected),但这时候chooseBarDelegate还是nil!

为什么会这样?因为你是在InfoViewController里试图设置listViewController.chooseBarDelegate = self,这个操作要么时机太晚(ListViewController已经执行完代理方法调用了),要么你拿到的listViewController根本不是当前正在present的那个实例,导致代理完全没绑定到刚创建的infoVC上。

两种修复方案

方案一:直接赋值(最简单,推荐)

既然你已经拿到了infoVC的实例,直接给它的infoBar属性赋值就行,完全没必要用代理(代理更适合反向传值,比如从详情页回传数据到列表页):

修改ListViewController里的didSelectRowAt方法:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let barSelected = bars[indexPath.row] 
    let infoVC = storyboard?.instantiateViewController(withIdentifier: "infoViewController") as! InfoViewController 
    // 直接给详情页的属性赋值
    infoVC.infoBar = barSelected
    present(infoVC, animated: true, completion: nil)
}

这样改完,你甚至可以把代理相关的代码(协议定义、代理属性、InfoViewController里的代理扩展)都删掉,代码更简洁。

方案二:正确设置代理(如果一定要用代理)

如果你坚持要用代理传值,那得在实例化infoVC之后,立刻把它设置为ListViewController的代理,而不是在InfoViewController里反向设置:

修改ListViewController的didSelectRowAt:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let barSelected = bars[indexPath.row] 
    let infoVC = storyboard?.instantiateViewController(withIdentifier: "infoViewController") as! InfoViewController 
    // 在这里绑定代理,把当前的infoVC设为代理对象
    self.chooseBarDelegate = infoVC
    chooseBarDelegate?.chooseBar(barChosen: barSelected) 
    present(infoVC, animated: true, completion: nil)
}

同时,删掉InfoViewController里的那行listViewController.chooseBarDelegate? = self,因为现在代理已经在列表页正确绑定了。

为什么原来的代码不行?

你之前在InfoViewController里设置代理的操作,一般是在viewDidLoad这类生命周期方法里执行,但这时候ListViewController已经跑完了didSelectRowAt里的代码——代理方法早就调用过了,infoBar自然不会被赋值。而且如果你的listViewController实例不是当前那个触发跳转的列表页,那代理绑定完全是无效的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:37:08