美文网首页
为什么cellForRowAtIndexPath代理方法不执行

为什么cellForRowAtIndexPath代理方法不执行

作者: _我和你一样 | 来源:发表于2019-02-14 18:15 被阅读0次
问题描述

tableView有一个代理方法:

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

用来在需要时返回cell视图。

但是你可能偶尔会出现 下面的两个代理方法都走了,而上面的方法没有走,

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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented

那么可能的原因是什么呢?为什么只走了部分代理呢?

思路分析

首先,如果代理方法没有走,你应当从那些方面分析呢?

  • 代理有没有设置?
  • 代理方法有没有实现?
  • numberOfRowsInSection:返回大于1吗?
  • 你知道代理方法在什么时候会调用吗?

首先,NSTableView的代理方法,在tableView将要出现的时候会调用其代理方法,通常情况在 tableView 被 addSubview:时会被调用,或者在 reloadData时会被调用。cell在可以显示的时候才会调用cellForRowAtIndexPath,如果tableView的frame大小不能显示cell的时候,cellForRowAtIndexPath也可能不会调用。

所以,我们可以分析,在确定代理方法实现的情况下,代理方法为什么只调用了部分方法,而没有全部调用。很可能是因为代理在使用过程中被释放掉了。

我们知道代理一般使用weak属性,是一种弱引用,所以,倘若创建了一个代理对象没有被控制器或者其他对象强引用,就直接设置到tableView的代理,就可能出现代理方法调用部分的情况。

所以要检查代理有没有地方强引用。

解决方案

因此检查tableView的代理方法为什么没有调用或者只部分调用,应当检查以下几个方面:

  • 代理对象有没有被控制器或其他对象所持有
  • 是否设置tableView的delegate和dataSource
  • 是否实现了所需的代理方法
  • numberOfRowsInSection:返回是否大于1
  • tableView是否被添加到父视图( addSubview对添加到视图强引用)
  • 是否触发了代理调用,比如视图将要出现,tableView的frame正常

相关文章

网友评论

      本文标题:为什么cellForRowAtIndexPath代理方法不执行

      本文链接:https://www.haomeiwen.com/subject/tnkyeqtx.html