一旦屏幕上的细胞不再可见,我需要得到通知。
UITableView已经有一个名为tableView:didEndDisplayingCell:forRowAtIndexPath:
的委托方法,但这个委托方法永远不会被调用。是的,我确实拥有UITableView集的代理。
检测正在移除的细胞的其他任何方法?我需要能够在被另一个项目重用之前保存此单元格的内容(输入)。
修改
根据文档tableView:didEndDisplayingCell:forRowAtIndexPath:
是iOS 6及更高版本的API。有没有办法在iOS 5上实现这一点?
答案 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];
并检查可见路径数组的任何更改。