5

一旦单元格在屏幕上不再可见,我需要得到通知。

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

还有其他方法可以检测细胞被移除吗?我需要能够保存此单元格的内容(输入),然后才能被另一个项目重用。

编辑:

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

4

3 回答 3

8

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

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

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

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

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

因此,您应该didMoveToWindow在您的单元子类和tableView:didEndDisplayingCell:forRowAtIndexPath:您的委托中实现这两者,并确保如果两者都被调用,或者只有一个被调用,则它可以工作。

于 2012-12-07T21:35:26.853 回答
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
于 2012-12-07T21:37:15.730 回答
1
tableView:didEndDisplayingCell:forRowAtIndexPath:

仅适用于 iOS6 及更高版本。

完成您所追求的一种(尽管很慢)方法是使用 scrollView 委托方法来监视 tableview 何时滚动。从那里调用:

NSArray *visiblePaths = [tableView indexPathsForVisibleRows];

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

于 2012-12-07T21:17:31.210 回答