2

当用户在 uitableview 中上下滚动时,单元格会被破坏和创建。

有没有办法检测一个细胞何时将被破坏或已经被破坏?

4

5 回答 5

12

假设通过“被破坏”实际上是指一个单元被重用,只需prepareForReuseUITableViewCell派生类中实现即可。

准备重用

准备一个可重用的单元格以供表视图的委托重用。

- (void)prepareForReuse

讨论

如果 UITableViewCell 对象是可重用的——也就是说,它有一个重用标识符——这个方法在从 UITableView 方法 dequeueReusableCellWithIdentifier: 返回对象之前调用。出于性能原因,您应该只重置与内容无关的单元格属性,例如 alpha、编辑和选择状态。重用单元格时,tableView:cellForRowAtIndexPath: 中的表视图委托应始终重置所有内容。如果单元对象没有关联的重用标识符,则不调用此方法。如果重写此方法,则必须确保调用超类实现。

可用性 适用于 iOS 2.0 及更高版本。另见 – initWithFrame:reuseIdentifier: @property reuseIdentifier 在 UITableViewCell.h 中声明

于 2012-05-28T13:10:00.033 回答
4

在不涉及适用性或性能的影响的情况下,另一种选择可能是使用 UITableView 类的 visibleCells 方法定期检查哪些单元格仍然可见:

- (NSArray *)visibleCells

根据文档:

返回一个包含 UITableViewCell 对象的数组,每个对象代表接收表视图中的一个可见单元格。

于 2012-10-15T21:09:09.527 回答
0

您可以继承UITableViewCell并覆盖它的dealloc方法。

假设您正在重用单元以节省资源,那么这样做有什么好的理由吗?

于 2012-05-28T13:00:25.487 回答
0

您试图拦截的是 UITableView 内部实现的一部分以及它如何管理其单元格。虽然有一些方法可以尝试拦截此类行为,但我建议您避免使用它们,因为无法保证 UITableView 的未来实现会保持这种行为。

在这种情况下,最好考虑一种不同的方法:设计和实现您自己的表类,或者更改您的代码逻辑。

于 2012-05-28T14:03:19.737 回答
0

如上所述,细胞在离开屏幕时不会被破坏。但是,您可以执行一些操作来跟踪相关操作,具体取决于您要执行的操作。

首先有一个委托消息:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

这是在单元格进入屏幕之前调用的。另一种可能性是已经说明的单元格的 prepareForReuse 方法。

另一种方法是:尝试覆盖 willMoveToSuperview: 或任何其他相关方法。我不确定这是否在单元格变得不可见后被触发,但它可能会起作用。

最好的问候,迈克尔

于 2012-05-28T14:42:45.967 回答