当用户在 uitableview 中上下滚动时,单元格会被破坏和创建。
有没有办法检测一个细胞何时将被破坏或已经被破坏?
假设通过“被破坏”实际上是指一个单元被重用,只需prepareForReuse
在UITableViewCell
派生类中实现即可。
准备重用
准备一个可重用的单元格以供表视图的委托重用。
- (void)prepareForReuse
讨论
如果 UITableViewCell 对象是可重用的——也就是说,它有一个重用标识符——这个方法在从 UITableView 方法 dequeueReusableCellWithIdentifier: 返回对象之前调用。出于性能原因,您应该只重置与内容无关的单元格属性,例如 alpha、编辑和选择状态。重用单元格时,tableView:cellForRowAtIndexPath: 中的表视图委托应始终重置所有内容。如果单元对象没有关联的重用标识符,则不调用此方法。如果重写此方法,则必须确保调用超类实现。
可用性 适用于 iOS 2.0 及更高版本。另见 – initWithFrame:reuseIdentifier: @property reuseIdentifier 在 UITableViewCell.h 中声明
在不涉及适用性或性能的影响的情况下,另一种选择可能是使用 UITableView 类的 visibleCells 方法定期检查哪些单元格仍然可见:
- (NSArray *)visibleCells
根据文档:
返回一个包含 UITableViewCell 对象的数组,每个对象代表接收表视图中的一个可见单元格。
您可以继承UITableViewCell
并覆盖它的dealloc
方法。
假设您正在重用单元以节省资源,那么这样做有什么好的理由吗?
您试图拦截的是 UITableView 内部实现的一部分以及它如何管理其单元格。虽然有一些方法可以尝试拦截此类行为,但我建议您避免使用它们,因为无法保证 UITableView 的未来实现会保持这种行为。
在这种情况下,最好考虑一种不同的方法:设计和实现您自己的表类,或者更改您的代码逻辑。
如上所述,细胞在离开屏幕时不会被破坏。但是,您可以执行一些操作来跟踪相关操作,具体取决于您要执行的操作。
首先有一个委托消息:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
这是在单元格进入屏幕之前调用的。另一种可能性是已经说明的单元格的 prepareForReuse 方法。
另一种方法是:尝试覆盖 willMoveToSuperview: 或任何其他相关方法。我不确定这是否在单元格变得不可见后被触发,但它可能会起作用。
最好的问候,迈克尔