tableview:cellForRowAtIndexPath:不执行的原因

当在vc1上添加vc2的view并包含一个tableview时,发现tableview的reloadData方法调用后,numberOfSectionsInTableView和tableview:numberOfRowsInSection:执行正常,但tableview:cellForRowAtIndexPath:未执行。问题在于视图还未显示时就调用了reloadData。解决方案是将reloadData调用移到vc2的viewWillAppear中,以确保在视图显示时正确绘制cell。另外,为了优化内存使用,可以考虑使用addChildViewController来管理多个子控制器的视图显示。
摘要由CSDN通过智能技术生成

       遇到一个比较奇葩的问题,调用tableview的reloadData方法时,numberOfSectionsInTableView和tableview:numberOfRowsInSection:都正常执行,可是tableview:cellForRowAtIndexPath:却不执行。

       我所要实现的效果是在vc1上添加vc2的view,vc2的view上有子视图tableview,tableview的delegate和datasource设置为vc2。也就是说tableview:cellForRowAtIndexPath:是在vc2中实现的。刚开始我以为是因为没有在主线程中调用reloadData方法造成的,因为tableview:cellForRowAtIndexPath:是在tableview显示的时候(UI 刷新)调用,而 UI 刷新是在主线程中执行的。BUT,把reloadData放入主线程后,无卵用。。

       经过排查,发现我的方法调用顺序是这样的:viewDidLoad -> setupView -> reloadData,也就是说,我在viewWillAppear之前(视图还未显示)调用了reloadData方法。viewDidLoad是视图加载完成后调用,此时视图还未开始显示。而tableview:cellForRowAtIndexPath:是在具体的cell显示时执行,绘制cell。我把reloadData放在viewDidLoad中才造成了这个问题。

       那么现在有两种解决方法:

       第一种:把reloadData放在vc2的viewWillAppear中。

       第二种:将vc2写成NSObject的子类,它有一个属性view,将这个view添加到vc1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值