接收关于从其父集合或表视图中删除 UICollectionViewCell(或 UITableViewCell)的通知

Posted

技术标签:

【中文标题】接收关于从其父集合或表视图中删除 UICollectionViewCell(或 UITableViewCell)的通知【英文标题】:Receiving notification on a UICollectionViewCell's (or UITableViewCell's) removal from its parent collection or table view 【发布时间】:2012-10-30 10:55:30 【问题描述】:

背景:

我有一个UICollectionViewController,它以两种模式之一显示项目,用户可以在这两种模式之间切换。每种模式使用不同类别的UICollectionViewCell。我们将这些模式称为“列表视图”和“网格视图”。

当我切换模式时,我在UICollectionView 上调用.reloadData,它使用正确的单元格类重新绘制集合视图。这里一切正常。

现在:在一种类型的单元格的 UICollectionViewCell 子类中,我希望在包含它的集合视图切换模式时得到通知。视觉上,屏幕上的一个单元格消失了;集合视图完全使用其他类型的单元格绘制。切换回来时,单元格会重新显示。

问题:

UICollectionViewCell 被父集合视图“删除”(即不再显示;我不确定幕后发生了什么)时,我如何收到通知?

注意事项:

当集合视图的updateData 导致不再包含该单元格时,不会在该单元格上调用prepareForReusewillTransitionFromLayout:toLayout:(空布局?)未被调用。 覆盖didMoveToSuperview 没有帮助;它没有被调用。 观察单元格上的.hidden.alpha 不起作用。 单元格的dealloc 未被调用;它停留在重用队列中。

牢房里一定有什么东西在发生变化,我可以观察到或陷入其中,那是什么?

【问题讨论】:

【参考方案1】:

更新:UICollectionViewDelegate 有这个方法,从文档中看它似乎符合我的要求:

collectionView:didEndDisplayingCell:forItemAtIndexPath:

原答案:

当我要切换并调用reloadData 时,我通过让UICollectionViewController 手动通知可见 单元格即将到来的厄运,我得到了这项工作:

- (void)notifyCellsWillBeHidden 
    for (UICollectionViewCell *cell in self.collectionView.visibleCells) 
        if ([cell respondsToSelector:@selector(willBeRemovedFromCollectionView)]) 
            [cell performSelector:@selector(willBeRemovedFromCollectionView)];
                
    

如果实现了上述方法,这些单元格就可以做他们需要做的事情了。

调用prepareForReuse 可能不是一个好主意,因为如果出现问题,会在重新显示单元格之前再次调用它。

我仍然很好奇是否有办法让单元格接收通知,即如果没有明确的调用,它将变得不可见。

【讨论】:

以上是关于接收关于从其父集合或表视图中删除 UICollectionViewCell(或 UITableViewCell)的通知的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式从其父视图中删除子视图并将其附加到其他父视图

SWIFT:如何以编程方式设置集合视图的帧大小,使其等于其父视图?

Linq to SQL(视图或表)?

在隐藏的 UIView 中接收触摸事件?

从文件或表中删除重复项

如何从集合视图中删除项目?