2012-05-28 59 views
1

随着用户在uitableview中上下滚动,细胞被破坏和创建。当uitableviewcell被破坏时的iOS回调

有没有办法来检测细胞何时会被销毁?

+0

也许你应该把你的问题放在你真正想做的事情的背景中。我回答的问题是,当他们滚动时,不能保证细胞被破坏;他们通常被缓存以供重新使用。 –

+0

http://stackoverflow.com/questions/3330735/detect-when-uitableviewcell-goes-out-of-scope – Lee

回答

11

假设通过“破坏”你实际上是指一个单元格被重用,只需在你的UITableViewCell派生类中实现prepareForReuse

prepareForReuse

准备由表视图的代表用于再使用可重复使用的小区。

- (void)prepareForReuse 

讨论

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

可用性 适用于iOS 2.0及更高版本。 另请参见 - initWithFrame:方法reuseIdentifier: @property reuseIdentifier 宣布 UITableViewCell.h

+0

正确。这个影响很重要。 'prepareForReuse'消息在单元出池时发送,而不是在完成显示时发送。这意味着它不能依赖于释放单元实现保留的重量级资源。 –

0

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

假设您正在重新使用单元格来保存资源,这样做的好理由是什么?

0

什么你试图拦截是内部实现的UITableView的一部分以及如何管理其细胞。虽然有些方法可以尝试拦截此类行为,但我建议您避免使用它们,因为不能保证将来的UITableView实现将保持此行为。

在这种情况下,考虑采用不同的方法会更好:设计并实现自己的表类或更改代码逻辑。

0

如上所述,当离开屏幕时单元不会被破坏。不过,您可以执行一些操作,以跟踪相关操作,具体取决于您尝试执行的操作。

首先出现的是一个委托消息:

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

这一个小区进入屏幕之前被调用。另一种可能性是已经提到的单元格的prepareForReuse方法。

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

最好的问候, 迈克尔

4

没有进入适用性或性能的影响,另一个选择可能是定期检查哪些细胞保持可见,使用的UITableView类的visibleCells方法:

- (NSArray *)visibleCells 

根据文档:

返回包含UITableViewCell对象的数组,每个对象表示一个可见的ce在接收表视图中。