iOS - 如何检测UITableViewCell是否移出可见视图?

5
一旦单元格不再在屏幕上可见,我需要得到通知。
UITableView 已经有一个委托方法叫做 tableView:didEndDisplayingCell:forRowAtIndexPath: ,但是这个委托方法从未被调用。是的,我已经为我的 UITableView 设置了委托。
还有其他方式来检测单元格被移除吗?我需要能够保存此单元格的内容(输入),然后才能被另一个项目重复使用。
编辑:
根据文档,tableView:didEndDisplayingCell:forRowAtIndexPath: 是 iOS 6 及更高版本的 API。有没有办法在 iOS 5 上实现这个功能呢?

你是否已经添加了 UITableViewDelegate 并将表视图的代理设置为 self - Ben Lu
是的,我在我的问题中特别提到了这一点 :) - aryaxt
你正在测试哪个版本的iOS? - rob mayoff
我的基础 SDK 是 iOS 6.0。它可以在 iPad 6.0 上工作,但无法在 iPad 5.1 上运行。 - aryaxt
根据文档,“仅适用于iOS 6.0及以上版本。”那么在iOS 5上有没有办法做到这一点呢? - aryaxt
如果特定索引路径处的单元格不可见,cellForRowAtIndexPath: 将返回 nil。也许这会有所帮助。 - Ben Lu
3个回答

8
在iOS 6.0之前的版本中,表视图不会发送 tableView:didEndDisplayingCell:forRowAtIndexPath: 消息。
如果您使用UITableViewCell的子类,则可以通过覆盖didMoveToWindow来在旧版iOS上获得相同的效果:
- (void)didMoveToWindow {
    if (self.window == nil) {
        // I have been removed from the table view.
    }
}

您可能需要给您的单元格一个(弱引用或不安全的未保留引用)返回到您的表视图代理,以便您可以向代理发送消息。
但是,在所有版本的iOS中,您不能仅依赖于didMoveToWindow。在iOS 6之前,表视图总是在重用之前将表视图单元格作为子视图删除,因此单元格将始终在被重用之前接收到didMoveToWindow。然而,从iOS 6开始,表视图可以重用单元格而不将其作为子视图删除。表视图只会更改单元格的框架以将其移动到新位置。这意味着从iOS 6开始,单元格在被重用之前并不总是接收到didMoveToWindow。
因此,您应该在您的单元格子类中实现didMoveToWindow,并在您的代理中实现tableView:didEndDisplayingCell:forRowAtIndexPath:,并确保如果两者都被调用或只调用其中一个,则它能够正常工作。

在看到此回答之前我已经发布了我的答案,因此可能会接受这个答案作为最终答案,因为它非常接近我的答案并解决了问题。 - aryaxt

4
我最终使用以下组合以确保逻辑适用于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

1
tableView:didEndDisplayingCell:forRowAtIndexPath:

仅适用于iOS6及以上版本。

实现您想要的功能的一种方法(虽然较慢)是使用scrollView委托方法来监视tableview滚动。从那里,调用:

NSArray *visiblePaths = [tableView indexPathsForVisibleRows];

并检查可见路径数组是否有任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接