遇到一个比较奇葩的问题,调用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.