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

3

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

2个回答

7

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


4
您已经有一些用于表中每行的数据结构,对吗?在这些数据中添加一个额外的BOOL值,以跟踪该行是否已展开。 - undefined
模型-视图-控制器(Model-View-Controller)可能是你需要了解的东西。不要将模型放在视图中。 - undefined

2

您有几个选择。

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

另一个选择可能是保留对每个单元格的引用,并告诉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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接