【问题标题】:How can I disable UITableView's cells reloading when scrolling it?滚动时如何禁用 UITableView 单元格重新加载?
【发布时间】:2013-01-26 18:14:26
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c cocoa-touch uitableview


    【解决方案1】:

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

    【讨论】:

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

    您有几个选择。

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

    另一种选择可能是保留您自己对每个 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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多