我的 UITableViewCells 可以接受数据输入。在一个单元格中工作时,用户想要向上滚动,检查另一个单元格中的内容,然后返回到第一个单元格并继续数据输入是非常自然的。
问题是这会经常导致 UITableView 回收单元格,这会对我的程序造成严重破坏。
有什么办法可以暂时告诉iOS不要回收电池吗?
一旦数据输入完成,如果它被回收,我就可以了。
我应该补充一点,数据输入使用自定义键盘。因此,第一响应者状态不是问题。
我的 UITableViewCells 可以接受数据输入。在一个单元格中工作时,用户想要向上滚动,检查另一个单元格中的内容,然后返回到第一个单元格并继续数据输入是非常自然的。
问题是这会经常导致 UITableView 回收单元格,这会对我的程序造成严重破坏。
有什么办法可以暂时告诉iOS不要回收电池吗?
一旦数据输入完成,如果它被回收,我就可以了。
我应该补充一点,数据输入使用自定义键盘。因此,第一响应者状态不是问题。
为显着不同的单元格赋予不同的 cellIdentifier。如果底部的单元格有自己的标识符,那么当用户滚动到底部时,它不会从顶部回收您的单元格。但是,这仍会将您的单元格保留在重用队列的顶部,因此当您滚动回顶部时,您无需重新创建它。
如果您以常用的方式使用dequeueReusableCellWithIdentifier:
方法,则无法防止细胞回收。UITableView
如果你想这样做,你应该在 UITableView 的数据源协议方法中自己实现它- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
。
正如 Chiefly Izzy 所说,这不是一种常见的工作方式。违背列表的工作方式可能会导致问题。如果您想减少问题,请将单元格的内容保留在内存中,并在调用 willDisplayCell 时使用此保存的内容重新填充单元格,而不是每次都从头开始重建整个内容。
Gendolkari 的解决方案给了我一个想法,让我暂时从出队周期中删除一个单元格。它确实涉及使用 KVC 设置只读值,因此它不适合真正的黑客攻击。
当您第一次想从循环中删除单元格时,请更改该特定单元格的重用标识符。我们希望以后能够找到该单元格,因此将其重命名为我们可以索引的名称。我发现 [NSIndexPath description] 在这里很有用。重用标识符是一个只读属性,但这是 Objective-C,我们有 KVC:
[cell setValue:[[self.tableView indexPathForCell:cell] description] forKey:@"reuseIdentifier"];
现在,每当我们在 cellForRowAtIndexPath 中重用一个单元格时:
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
我们不会取回这个特定的单元格,因为我们已经更改了重用标识符。
但是,如果我们向下滚动然后向上滚动,我们可能想要显示我们从出队循环中删除的原始单元格。要做到这一点,当我们重用一个单元时,首先尝试根据 indexPath 使一个单元出队,并且如果我们找不到简单地基于基本单元标识符字符串的出列单元的尝试:
UITableViewCell *cell;
cell = [self.tableView dequeueReusableCellWithIdentifier:[indexPath description]];
if (!cell) cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
当您想将该单元格放回出队周期时,只需将重用标识符更改回原始值:
[cell setValue:@"cellIdentifier" forKey:@"reuseIdentifier"];