问题描述
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正常
网友评论