UITableView:加载所有单元格

Posted

技术标签:

【中文标题】UITableView:加载所有单元格【英文标题】:UITableView: load all cells 【发布时间】:2012-09-04 17:49:07 【问题描述】:

是否可以在加载视图时加载 UITableView 的所有单元格,以便在滚动时不加载它们? (我会在执行此操作时显示加载屏幕)

拜托,这是我项目中唯一的方法(抱歉太复杂了,无法解释原因^^)

编辑:

好吧,让我解释一下,我确定要做什么:

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath

   NSString *cellIdentifier = [NSString stringWithFormat:@"Identifier %i/%i", indexPath.row, indexPath.section];
   CustomTableCell *cell = (CustomTableCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
   NSDictionary *currentReading;

   if (cell == nil)
   
       cell = [[[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

       UILabel *label;
       UIView *separator;

       if(indexPath.row == 0)
       
           // Here I'm creating the title bar of my "table" for each section
       
       else
       
           int iPr = 1;

           do
           
               currentReading = [listData objectAtIndex:iPr-1];
               iPr++;
            while (![[currentReading valueForKey:@"DeviceNo"] isEqualToString:[devicesArr objectAtIndex:indexPath.section]] || 
                      [readingresultsArr containsObject:[currentReading valueForKey:@"ReadingResultId"]]);

           [readingresultsArr addObject:[currentReading valueForKey:@"ReadingResultId"]];
           //
           // ...
           //
       
    
    return cell;

我的错误发生在 do-while-loop 中: “listData”是一个包含多个字典的数组。 我的问题是,当我慢慢向下滚动表格时,一切都很好,但是当我快速滚动到视图的末尾然后滚动到中间时,我得到了 iPr 不在的错误数组的范围。所以问题是,第一部分的最后一行已经被添加到“readingresultsArr”中,但还没有加载或想要再次加载。 这就是我想一次加载所有单元格的原因。

【问题讨论】:

“拜托,这是我项目中唯一的方法”——当然不应该。请解释一下,即使它很复杂。除了这不可能之外,这在内存管理方面也是一个可怕的错误。 @H2CO3 我已经编辑了我的问题并更详细地描述了我的问题。希望你能帮助我。 您能解释一下您要使用do...while 循环来完成什么吗?看起来您正试图找到一个满足某些标准的对象,然后立即构建一个新数组,但是为什么需要在那里这样做呢?您可以在重新加载表之前构建该数组吗? 【参考方案1】:

您可以通过调用来预先分配所有单元格:

[self tableView: self.tableView cellForRowAtIndexPath: indexPath];

表中的每一行。将上述行放入适当的 for 循环中并在 viewDidAppear 中执行此代码。

但问题是 tableView 不会保留所有这些单元格。它会在不需要时丢弃它们。

您可以通过将NSMutableArray 添加到UIViewController 来解决该问题,然后缓存所有在cellForRowAtIndexPath 中创建的单元格。如果您的表在其生命周期内有动态更新(插入/删除),您也必须更新缓存数组。

【讨论】:

这就是我一直在寻找的答案 :) 你是我的英雄!非常感谢!但也感谢其他人的帮助。 我最初说使用 NSMutableArray,但 NSDictionary 可能会更好,因为您可以使用 indexPath.row 作为键。 NSMutableArray 不会让你乱序添加东西。 是的,我使用了 NSDictionary,并使用了像“indexPath.row/indexPath.section”这样的字符串作为键。但是你给我带来了正确的方向,谢谢:) PS: [self.tableView tableView: self.tableView cellForRowAtIndexPath: indexPath];您的答案中应该没有第一个“.tableView” @Kent 嘿,所以我遇到了相反的问题。我所有的单元格都被加载到内存中,cellforrowatindexpath 正在被调用,我没有手动调用它。这是为什么? 导致内存问题,细胞没有从内存中释放【参考方案2】:

在 uiscrollview 上放一个 uitableview

例如,您期望完整列表 uitableview 的高度为 1000

然后设置uiscrollview contentsize为320X1000 并设置uitableview高度为1000

然后所有单元格加载它们的内容,甚至在屏幕上不可见

【讨论】:

解决问题的完美方法。 感谢您的评论。想知道为什么表格视图总是加载它的所有行,是的,它在滚动视图下。不知道为什么会这样,但是好的,必须重新设计 UI @highmaintenance 问题不在于答案,而在于问题。这个答案可以完成,还需要禁用 tableview 的滚动。【参考方案3】:

在我的情况下,我使用 automaticDimension 作为单元格高度并将estimatedRowHeight 设置为小,这就是 tableview 加载所有单元格的原因

【讨论】:

欢迎来到 Stack Overflow。 :-) 你能举个例子吗? 请提供代码sn-p更好地理解你的答案 @Lina 提到的并不是问题的解决方案,但是,如果您在使用automaticDimension 时需要预加载比屏幕上呈现的单元格更多的单元格,这是一个非常好的技巧。这个技巧有时对我很有用,我有一个包含一些复杂单元格的表格视图,但我只有 4 或 5 个单元格。如果我为estimatedRowHeight 设置了一个较低的值,tableview 将预加载所有单元格,因为它希望它们是可见的。在此之后,当我滚动到底部时,系统已经预加载了所有单元格。如果使用高值,会感觉滞后。【参考方案4】:

根据 juancazalla 的评论,我发现如果您有一个使用 automaticDimension 的 tableView,一次加载所有单元格的最佳方法是通过将estimatedRowHeight 设置为较低的值(例如 1)来实现。

【讨论】:

以上是关于UITableView:加载所有单元格的主要内容,如果未能解决你的问题,请参考以下文章

IOS UITableView检查一个单元格

UITableView 重新加载除一个以外的所有单元格

UITableview:无法从其数据源获取单元格

UITableView 删除并重新加载单元格

如何在自定义单元格的 initWithStyle: 方法中获取 UITableView 的宽高?

即使在屏幕外,iOS UITableView 单元格也会加载