iOS – 检测UITableViewCell被移出可见视图?

一旦细胞不再在屏幕上可见,我需要得到通知。

UITableView已经有一个名为tableView:didEndDisplayingCell:forRowAtIndexPath:委托方法tableView:didEndDisplayingCell:forRowAtIndexPath:但是这个委托方法永远不会被调用。 是的,我有我的UITableView集委托。

任何其他方式来检测被删除的单元格? 我需要能够保存该单元格的内容(input),然后再被其他项目重用。

编辑:

根据文档tableView:didEndDisplayingCell:forRowAtIndexPath:是iOS 6及更高版本的API。 有没有办法在iOS 5上实现这一点?

在6.0以上版本的iOS上,表视图不会发送tableView:didEndDisplayingCell:forRowAtIndexPath:消息。

如果您使用的是UITableViewCell的子类,则可以通过覆盖didMoveToWindow在旧版本的iOS上获得相同的效果:

 - (void)didMoveToWindow { if (self.window == nil) { // I have been removed from the table view. } } 

您可能需要将您的单元格(弱或unsafe_unretained)引用返回到您的表视图委托,以便您可以发送委托给消息。

但是,不能只依赖于所有版本的iOS的didMoveToWindow 。 在iOS 6之前,表视图总是在重用它之前删除表视图单元格作为子视图,因此单元格在重用之前总是会收到didMoveToWindow 。 但是,从iOS 6开始,表视图可以重用单元而不将其作为子视图进行移除。 表视图将简单地改变单元格的框架,将其移动到新的位置。 这意味着从iOS 6开始,单元在重用之前并不总是接收didMoveToWindow

所以你应该在你的cell子类中实现didMoveToWindow ,并且在你的委托中实现tableView:didEndDisplayingCell:forRowAtIndexPath:并且确保它在两个被调用的情况下工作,或者只调用一个。

我结束了使用下面的组合,以确保逻辑适用于iOS 5.0和6.0

电池逻辑

 @protocol MyCellDelegate - (void)myCellDidEndDisplaying:(MyCell *)cell; @end @implementation MyCell // Does not work on iOS 6.0 - (void)removeFromSuperview { [super removeFromSuperview]; [self.delegate myCellDidEndDisplaying:(MyCell *)self]; } @end 

查看控制器逻辑

 @implementation MyViewcontroller - (void)myCellDidEndDisplaying:(MyCell *)cell { IndexPath *indexPath = [self.tableView indexPatForCell:cell]; // do stuff } // Does not work on iOS below 6.0 - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { } @end 
 tableView:didEndDisplayingCell:forRowAtIndexPath: 

仅在iOS6及更高版本中可用。

一个(尽pipe缓慢)的方式来完成你以后会使用scrollView委托方法来监视tableview滚动。 从那里,请拨打:

 NSArray *visiblePaths = [tableView indexPathsForVisibleRows]; 

并检查对可见path数组的任何更改。