【发布时间】:2015-07-31 04:50:51
【问题描述】:
刚刚在 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 的方法)。任何人都知道它为什么这样做?这是定义的行为吗?还是 Apple 的 TableView 框架中的错误?
【问题讨论】:
-
好像是苹果内部的处理方式。我想我们需要一位 Apple 工程师来回答这个问题。
-
不应该是浮点数 44.0 和 88.0 吗?
-
也许这样在技术上会更有效,提前告诉编译器它是一个浮点数......但我无法想象它的性能差异很大;我拥有的任何最后都会有一个点 0 的浮点数都是这样写的,我没有遇到任何问题......
标签: objective-c ios uitableview