首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从heightForRowAtIndexPath调用numberOfRowsInSection

从heightForRowAtIndexPath调用numberOfRowsInSection
EN

Stack Overflow用户
提问于 2010-12-08 05:31:55
回答 1查看 4.9K关注 0票数 13

刚刚在UITableView类中发现了一个非常奇怪和意外的行为。我需要我分区中的最后一个表格单元格与其他单元格的高度不同,所以我基本上是这样做的:

代码语言:javascript
复制
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == [tableView numberOfRowsInSection:indexPath.section] - 1)
        return 44;
    else
        return 88; //double size for all but the last row
}

看起来很简单,但是当我运行它的时候,我得到了一个无限循环,它崩溃了。我确定当我调用numberOfRowsInSection:时,它会调用我的数据源的tableView: numberOfRowsInSection:方法。这是有意义的,因为tableView的方法返回数据源值的缓存版本,因此它需要第一时间从数据源获取该值。然后,它调用heightForRowAtIndexPath,再次传递indexPath 0,0!它会不停地做这件事。

我可以通过使用以下命令来绕过它

代码语言:javascript
复制
[self tableView:tableView numberOfRowsInSection:indexPath.section]

相反(调用我的数据源方法而不是tableView的方法)。有人知道它为什么会这样吗?这是已定义的行为吗?或者是苹果TableView框架中的一个bug?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-21 02:34:01

问题是UITableView向您的数据源请求数据,而您告诉它答案取决于它是否缓存了数据。

你误解了苹果的控件所基于的M-V-C布局。一行高度的答案应该来自您的模型,而不是对视图类的回调。这导致视图类请求更多信息(以构建其内部缓存),这将启动一组递归调用。

确保所有数据源委托方法都从模型中返回数据,并且不依赖于视图缓存任何东西。如果您调试任何基于数据源的视图,您将会惊讶于一个UITableView请求数据的次数。但这就是苹果的编码方式。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4381805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档