刚刚在UITableView类中发现了一个非常奇怪和意外的行为。我需要我分区中的最后一个表格单元格与其他单元格的高度不同,所以我基本上是这样做的:
- (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!它会不停地做这件事。
我可以通过使用以下命令来绕过它
[self tableView:tableView numberOfRowsInSection:indexPath.section]相反(调用我的数据源方法而不是tableView的方法)。有人知道它为什么会这样吗?这是已定义的行为吗?或者是苹果TableView框架中的一个bug?
发布于 2011-01-21 02:34:01
问题是UITableView向您的数据源请求数据,而您告诉它答案取决于它是否缓存了数据。
你误解了苹果的控件所基于的M-V-C布局。一行高度的答案应该来自您的模型,而不是对视图类的回调。这导致视图类请求更多信息(以构建其内部缓存),这将启动一组递归调用。
确保所有数据源委托方法都从模型中返回数据,并且不依赖于视图缓存任何东西。如果您调试任何基于数据源的视图,您将会惊讶于一个UITableView请求数据的次数。但这就是苹果的编码方式。
https://stackoverflow.com/questions/4381805
复制相似问题