如何解决使用RxSwift绑定UITableView数据时IBOutlet报nil的错误?
崩溃核心原因
xib实现的ResultCell注册方式错误,系统创建cell时完全没有加载对应的xib文件,所有IBOutlet控件都处于未初始化的nil状态,调用configureData时访问隐式解包的idLbl就直接触发崩溃。
你现在用的resultsTv.register(ResultCell.self, forCellReuseIdentifier:)方法,是给纯代码编写的cell用的:这种注册方式下系统会直接调用cell的init(style:reuseIdentifier:)方法创建实例,不会关联任何xib资源,自然你在xib里拖的所有控件都不会被初始化。
具体修复步骤
- 替换cell注册逻辑
把setupUI方法里原来的注册代码,改成用UINib加载xib的注册方式:
注意这里的private func setupUI() { resultsTv.register( UINib(nibName: ResultCell.IDENTIFIER, bundle: nil), forCellReuseIdentifier: ResultCell.IDENTIFIER ) }nibName要和你本地ResultCell.xib的文件名完全匹配,如果xib文件名不是和类名同名,要替换成实际的文件名,不要硬用IDENTIFIER字符串。 - 检查xib绑定配置
打开ResultCell.xib确认两项配置:- 选中xib里最外层的UITableViewCell视图,在身份检查器中将Class设置为
ResultCell,不要去设置File's Owner的类 - 确认所有@IBOutlet的连线是连接到这个cell视图本身的出口,不是连到File's Owner的出口
- 选中xib里最外层的UITableViewCell视图,在身份检查器中将Class设置为
- Rx绑定逻辑无需修改
你现在写的rx.items数据流绑定是符合RxSwift用法的,只要cell注册加载正常,从ViewModel的BehaviorRelay到TableView的渲染链路是完全通的,不需要额外补传统的UITableViewDataSource/Delegate方法。
快速验证方法
修改完后可以在ResultCell的awakeFromNib方法里打个断点,运行触发列表渲染时,查看IBOutlet控件是否已经完成初始化,如果已经有值,说明xib加载流程正常,不会再出现隐式解包的崩溃。
内容的提问来源于stack exchange,提问作者cleanrun
相关产品推荐
相关产品推荐

