2

バックグラウンド:

UICollectionViewControllerユーザーが切り替えることができる2つのモードのいずれかでアイテムを表示するがあります。各モードは、異なるクラスのを使用しますUICollectionViewCell。これらのモードを「リストビュー」と「グリッドビュー」と呼びましょう。

モードを切り替えるときは、を呼び出します。これにより、正しいセルクラスを使用してコレクションビューが再描画.reloadDataされます。UICollectionViewここではすべてが正常に機能します。

現在:UICollectionViewCellあるタイプのセルのサブクラス内で、それを含むコレクションビューがモードを切り替えたときに通知を受け取りたいです。視覚的には、画面に表示されていたセルが消えます。コレクションビューは、他のタイプのセルで完全に描画されます。元に戻すと、セルが再表示されます。

質問:

UICollectionViewCell親コレクションビューからaが「削除」された(つまり、表示されなくなった、内部で何が起こっているのかまだわからない)場合、どうすれば通知できますか?

ノート:

  • prepareForReuseコレクションビューupdateDataによってセルが含まれなくなった場合、はセルで呼び出されません。
  • willTransitionFromLayout:toLayout:(空のレイアウト?)は呼び出されません。
  • オーバーライドdidMoveToSuperviewは役に立ちません。呼び出されません。
  • .hiddenセル上またはセル上での観察.alphaは機能しません。
  • セルdeallocは呼び出されません。再利用キューにとどまります。

セル内の何かが変化している必要があり、それを観察したり、フックしたりできます。それは何ですか?

4

1 に答える 1

1

更新:UICollectionViewDelegateこのメソッドがあります。ドキュメントからは、私が求めていることを実行しているようです。

  • collectionView:didEndDisplayingCell:forItemAtIndexPath:

元の答え:

切り替えて呼び出しようとしているときに、このメソッドを使用して、表示UICollectionViewControllerされているセルに差し迫った破滅を手動で通知することで、これを希望どおりに機能させることができました。reloadData

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

これらのセルは、上記のメソッドを実装した場合に必要なことを実行できます。

これが問題になる場合は、セルが再表示される前に再度呼び出されるため、呼び出すprepareForReuseことはお勧めできません。

明示的な呼び出しなしにセルが非表示になるという通知をセルが受信する方法があるかどうかは、まだ興味があります。

于 2012-10-30T11:15:32.053 に答える