暂时阻止UITableViewCell被回收

时间:2011-03-21 18:11:49

标签: iphone ios uitableview recycle

我的UITableViewCells可以接受数据输入。在一个单元格中工作时,用户想要向上滚动,检查另一个单元格中的内容,然后返回到第一个单元格并继续数据输入是完全自然的。

问题是这会经常导致UITableView回收单元格,这会对我的程序造成严重破坏。

有没有办法暂时告诉iOS不要回收电池?

数据输入完成后,如果它被回收,我没问题。

我应该补充说数据条目使用自定义键盘。因此,第一响应者状态不是问题。

4 个答案:

答案 0 :(得分:4)

为明显不同的单元格提供不同的cellIdentifier。如果底部的单元格有自己的标识符,那么当用户滚动到底部时,它不会从顶部回收您的单元格。但是,这仍然会将您的单元格保留在重用队列的顶部,这样当您向后滚动到顶部时,您将不需要重新创建它。

答案 1 :(得分:3)

如果以常见方式使用dequeueReusableCellWithIdentifier: UITableView方法,则无法阻止细胞回收。

如果您想这样做,您应该在UITableView的数据源协议方法- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中自行实现。

答案 2 :(得分:2)

正如Izzy所说,这不是一种常见的工作方式。与列表工作方式相反可能会导致问题。如果您想减少问题,请将您的单元格内容保留在内存中,并在调用willDisplayCell时使用此保存的内容重新填充单元格,而不是每次从头开始重建整个单元格。

答案 3 :(得分:0)

Gendolkari的解决方案让我想到暂时从出队周期中移除一个细胞。它确实涉及使用KVC设置只读值,因此它不适用于真正的黑客攻击。

当您首先要从循环中删除单元格时,请更改该特定单元格的reuseIdentifier。我们希望以后能够找到该单元格,以便将其重命名为可以索引的内容。我发现[NSIndexPath description]在这里很有用。 reuseIdentifier是一个只读属性,但这是Objective-C,我们有KVC:

[cell setValue:[[self.tableView indexPathForCell:cell] description] forKey:@"reuseIdentifier"];

现在每当我们在cellForRowAtIndexPath中重用一个单元格时:

UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

我们不会回到这个特定的单元格,因为我们已经更改了reuseIdentifier。

但是,如果我们向下滚动然后向上滚动,我们可能希望显示我们从出列循环中删除的原始单元格。当我们重新使用单元格时,首先尝试基于indexPath将单元格出列,并且如果我们无法根据基本单元格标识符字符串找到将单元格出列的尝试,请执行此操作:

UITableViewCell *cell;
cell = [self.tableView dequeueReusableCellWithIdentifier:[indexPath description]];
if (!cell) cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];

如果要将该单元格放回到出队循环中,只需将reuseIdentifier更改回原始值:

[cell setValue:@"cellIdentifier" forKey:@"reuseIdentifier"];