概述
遇到一个比较奇葩的问题,调用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.view上,然后在vc1的viewWillAppear中去实现vc2的tableview的reloadData。
建议使用第一种方法,封装性较好,层次清晰。不过需要注意的是,vc1可能不仅仅添加vc2的view,可能还需要添加vc3、vc4、vc5等等。如果把子vc的view全部加在vc1上,会耗费大量的内存。可以使用addChildViewController,把需要添加的vc都加上,但addSubview只添加需要显示的vc的view,切换vc时调用transitionFromViewController:toViewController:duration:options:animations:completion方法。
最后
以上就是聪慧黑猫为你收集整理的tableview:cellForRowAtIndexPath:不执行的原因的全部内容,希望文章能够帮你解决tableview:cellForRowAtIndexPath:不执行的原因所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复