如何在滚动时禁用UITableView的单元格重新加载?

时间:2013-01-26 18:14:26

标签: ios objective-c cocoa-touch uitableview

当我向上和向下滚动它时,当我不需要UITableView重新加载其单元格时,我遇到了问题。简单来说,我创建了自定义单元格,其中包含用户可以通过单击扩展的内容。例如,我有一个UILabel,其中包含大量文本,但没有完全显示,但用户可以单击按钮并展开文本,从而显示标签。我通过[tableview beginUpdates][tableview endUpdates]实现了这一切。但是,当我单击按钮并展开文本或图像并向下滚动到其他单元格然后向上UITableView当然重新加载我的单元格的内容和文本再次隐藏但单元格保持相同的大小,这看起来很难看。我可以通过某种方式自定义UITableView回收机制或更新内部单元缓存吗?

2 个答案:

答案 0 :(得分:7)

您无法禁用重新加载。正确的解决方案是确保您保存每个单元格的状态(扩展或不扩展),因此当滚动需要重新加载单元格时,您可以为当前状态提供适当的高度和内容。

答案 1 :(得分:2)

您有几个选择。

许多人忽略的是不使用UITableView,而是使用UIScrollView。只需将每个“单元格”创建为UIView子类,并将它们放在UIScrollView中的所需位置。唯一的问题是你必须自己看起来像一个tableview,每个单元格上的子视图和/或背景之间有分隔符。

另一种选择可能是保持对每个Cell的引用,并告诉UITableView不要重用它们。类似的东西:

- (void) initializeMyCells {
  self.cellArray = [NSMutableArray arrayWithCapacity:5];
  for ( int i = 0; i < 5; ++i ) {
     MyCellType *cell = [[MyCellType alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:nil]];
     [self.cellArray addObject:cell];
  }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  return self.cellArray[indexPath.row];
}