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

时间:2012-12-07 21:00:23

标签: ios uitableview

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

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

检测正在移除的细胞的其他任何方法?我需要能够在被另一个项目重用之前保存此单元格的内容(输入)。

修改

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

3 个答案:

答案 0 :(得分:8)

在6.0以上的iOS版本中,表格视图不会发送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:,并确保它们都被调用,或者只调用一个。

答案 1 :(得分:4)

我最终使用下面的组合来确保逻辑适用于iOS 5.0和6.0

CELL LOGIC

@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

VIEWCONTROLLER LOGIC

@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

答案 2 :(得分:1)

tableView:didEndDisplayingCell:forRowAtIndexPath:

仅适用于iOS6及更高版本。

完成后续工作的一种方法(虽然很慢)是使用scrollView委托方法来监视tableview滚动的时间。从那里,致电:

NSArray *visiblePaths = [tableView indexPathsForVisibleRows];

并检查可见路径数组的任何更改。