UITableView的cellForRowAtIndexPath方法不走的原因

1,996 阅读3分钟

记录一下自己做的傻逼事。各位看官见笑了!!

今天在构建页面的时候遇到了一个问题,数据都设置好后,tabview没有展示,打断点之后发现,tabview的DataSource没有走cellForRowAtIndexPath方法(具体如下),

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

不走此方法的原因分析:

一、没有设置DataSource

第一反应是看是否设置了self.tableView.dataSource = self;如果没有设置数据源,是肯定不会有数据的,但是是设置了的。

二、数据源中没有数据

第二种可能就是数据源的数组中是空的,也就是

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

这个两个方法有return值是0的,但是断点检查后发现,是有数据的。

三、tableView的宽度或高度等于0

在这种情况下numberOfSectionsInTableView和numberOfRowsInSection都执行,而cellForRowAtIndexPath不执行。正好符合了这种情况,但是我在创建tableView就已经设置了frame,所以也不是这个原因。

这下就懵逼了,难道还有第四种可能,百度也只有这几种情况。于是经过自己反复查找,最后发现了一个让我哭笑不得的原因:

前方高能!!!!

四、tableView没有渲染到视图上(说的逼格高一点,掩饰一下自己有多菜)

万万没想到!第四种清况出现了!!!大佬们请忍住别笑!!!(我们都经过专业的训练,无论多好笑我们都不会笑的,除非忍不住 ???)

此种情况与第三种情况同理,当tableView没有渲染到视图时,DataSource会走numberOfSectionsInTableView和numberOfRowsInSection方法,但是不会走cellForRowAtIndexPath方法(你都不显示,我走个🔨,赔你个傻逼走着乐呵乐呵?ps:此处傻逼说的是我自己,哈哈哈)。简而言之就是:

少了 [self.view addSubview:self.tableView];(对不起,实在忍不住了!!!)

由于以前偷懒用xib拖线拖多了,所以忘了这个这一茬(其实第一反应也不是DataSource,因为DataSource也可以xib连线拖,不过不是很好用)。找到原因之后真的是自己能把自己嘲笑死,哈哈哈!!难怪百度上没有,谁会想到还有人能小呆逼到这种程度??也就是我了吧!不过万一呢?所以冒着被嘲笑的风险,写下这篇文章,给一样粗心的小迷糊们看看,方便你们快速定位方法!唉~大风大浪(其实也没多大)都经历过来了,想不到在这个小地方翻船咯!!

(后补,感谢‘布呐呐u’同学的评论提示)

当然,第四种情况还有一种可能,相对来说会更常见一些,就是我们用的懒加载的方式,但在添加视图时用了[self.view addSubview:_tableView]方法,这样也会导致tableView没有渲染到视图,从而出现了上述情况。为了不让大家还得去评论区去寻找,特此补上这种情况。