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:加载所有单元格的主要内容,如果未能解决你的问题,请参考以下文章