Ios 如何禁用UITableView';滚动时是否重新加载单元格?

Ios 如何禁用UITableView';滚动时是否重新加载单元格?,ios,objective-c,cocoa-touch,uitableview,Ios,Objective C,Cocoa Touch,Uitableview,当我向上和向下滚动时,不需要UITableView来重新加载单元格时,我遇到了这个问题。简单地说,我创建了自定义单元格,其中包含用户可以通过单击来扩展的内容。例如,我有一个UILabel,其中有很多文本,但没有完全显示出来,但用户可以单击按钮并展开文本,从而展开一个标签。所有这些我都是通过[tableview开始更新]和[tableview结束更新]实现的。但是,当我点击按钮并展开文本或图像,向下滚动到其他单元格,然后向上滚动到UITableView时,当然会重新加载单元格的内容,文本再次隐藏,

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

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

您有几个选项

许多人忽视的一个问题是不要使用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];
}
-(无效)初始化mycells{
self.ray=[NSMutableArray阵列容量:5];
对于(int i=0;i<5;++i){
MyCellType*单元格=[[MyCellType alloc]initWithStyle:UITableViewCellStyleDefault重用标识符:nil]];
[self.addObject:cell];
}
}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
返回self.ray[indexPath.row];
}

您已经为表中的每一行使用了一些数据结构,对吗?向该数据添加一个额外的BOOL值,以跟踪行是否展开。可能需要阅读Model-view-controller。不要将模型放在视图中。