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数组的任何更改。