29

CollectionView に複数のアイテムがありますが、選択できるのはそのうちのいくつかだけです。私はデリゲートメソッドでこれを処理しています:

- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath

選択可能なアイテムが選択され、次のステップで選択不可能なアイテムの選択が NO を返す shouldSelectItemAtIndexPath によって拒否された場合に問題が発生し、選択されたアイテムはとにかく選択解除されます。

私も使ってみました

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath

しかし、それは同じ問題です。

これは UICollectionView の正しい望ましい動作ですか? はいの場合、選択できないアイテムが選択された場合、最後に選択したアイテムの選択解除を回避するにはどうすればよいですか?

4

7 に答える 7

13

私の仮定を修正する必要があります:最後の選択は選択解除されません!

選択時のセルの外観を変更するために、UICollectionViewCell の setSelected アクセサーをオーバーライドしました。選択できない項目を選択すると、最後に選択されたセルのアクセサ setSelected が複数回呼び出されます。最初は NO の状態で、次に YES の状態で、最後に再び NO の状態になります。最後の状態 NO により、セルの外観が選択されていないセルの外観に設定されました。

この奇妙な動作の理由がわかりませんし、解決することもできません。

私の回避策は、ViewController で選択したセルの外観を直接変更することです。

選択した外観を次の場所に設定します。

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

選択した外観を削除します:

- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath

現在のセルが選択されているかどうかを確認し、意図したとおりに外観を変更します。

   - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
于 2013-01-23T12:21:32.130 に答える
3

私はちょうどこれと同じ問題を抱えていました。私はさまざまな解決策を試しましたが、私の場合に最初に機能したのは、選択したセルをリロードしてから再選択することでした。これは、コレクション ビュー全体を再読み込みした場合でも、選択されていない外観で動かなくなったセルだけを再読み込みした場合でも機能しました。

私にとってうまくいかなかったアプローチ:

  • セルのselectedプロパティを true に設定するか、false に切り替えてから再度 true に切り替えます。
  • でアイテムを選択する-selectItemAtIndexPath:animated:scrollPosition:か、または で選択を解除してから-deselectItemAtIndexPath:再度選択します。
  • 選択した行だけをリロードする-reloadItemsAtIndexPaths:
  • ですべてをリロードします-reloadData
于 2016-02-11T20:00:24.303 に答える
1

デリゲート メソッドの DidSelect および DidDeselect メソッドでセルの外観を変更する必要があります。shouldSelect メソッドで NO が返された場合、DidSelect および DidDeselect は呼び出されないため、collectionView の選択状態と一致して、外観は同じままになります。

于 2014-01-10T08:52:40.510 に答える
1

UICollectionViewに比べてなぜこんなに散らかっているのかわかりませんUITableViewController... いくつか分かったことがあります。

複数回呼び出される理由- setSelected:は、シーケンス メソッドが呼び出されるためです。このシーケンスは、メソッドのシーケンスと非常によく似ていUITextFieldDelegateます。

実際に「選択する必要がある」と尋ねているため、実際にセルを選択する前にメソッド- collectionView:shouldSelectItemAtIndexPath:が呼び出されますか?collectionView

- collectionView:didSelectItemAtIndexPath:実際には、collectionViewがセルを選択した後に呼び出されます。したがって、「選択した」という名前です。

選択解除も同様です。

TL;DR -呼び出しcollectionViewてデリゲート メソッドでセルの選択を解除すると、すべて問題ありません。- collectionView:shouldSelectItemAtIndexPath:- selectItemAtIndexPath:animated:scrollPosition:

于 2015-04-29T05:31:01.800 に答える
0

やってみました:

- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath

これが希望どおりに機能することがわかりました。

于 2013-10-16T16:48:32.430 に答える