Js

UICollectionプロキシメソッドdidSelectItemAtIndexPathおよびdidDeselectItemAtIndexPath呼び出しの問題



Problems With Uicollection Proxy Methods Didselectitematindexpath



要求する:

  • セルをクリックすると、didSelectItemAtIndexPath:メソッドと呼ばれ、次に別のセルをクリックすると、最初に呼び出されますdidDeselectItemAtIndexPath:このメソッドは次に呼び出されますdidSelectItemAtIndexPath:メソッド

問題:

  • もちろん、この要件を実装するのは非常に簡単ですが、didSelectItemAtIndexPath呼び出されたときreloadItemsAtIndexPathsまたはreloadDataこれらの2つのメソッド(このメソッドでは、モデルデータを変更するために使用することがよくあります。これらの2つのメソッドを使用して、セルの上の表示を更新します)、セルの上のデータを更新するには、didDeselectItemAtIndexPathこのメソッドは呼び出されないことがわかります。

理由

  • その理由を少し分析しました。 reloadItemsAtIndexPathsまたはreloadDataを呼び出していた場合、システムはデータソースメソッドcellForItemAtIndexPath:を呼び出します。このメソッドでは、セルselectedプロパティがNOに再初期化されます。したがって、この時点ではセルは選択されていない状態であり、当然呼び出されません。didDeselectItemAtIndexPath:このメソッドはチェックされていません。

ソリューション分析

  • 理由を見つけて、私たちは方法を考え始めました。
  • cellForItemAtIndexPath:このメソッドはセルの状態を手動で設定できる場合があります(このメソッドは最後に呼び出されるため、ここではセルの状態がセルの最終状態になります)。セルを変更する可能性のある2つの方法をすぐに考えることができます。selected属性
    • 最初のタイプ:セルselected属性:公式の説明を見てみましょう

      This property manages the selection state of the cell only. The default value of this property is NO, which indicates that the cell is not selected.

通常、このプロパティの値を直接設定することはありません。このプロパティの値をプログラムで変更しても、セルの外観は変更されません。セルを選択して強調表示するための推奨される方法は、コレクションビューオブジェクトの選択メソッドを使用することです。
このプロパティは、セルの選択された状態を管理するためにのみ使用されます。デフォルト値はNOです。これは、セルがデフォルトで選択されていないことを意味します。
通常、このプロパティを直接設定しないでください。コードを使用してこの値を変更しても、セルの外観は変わりません。セルを選択してセルにハイライトを表示させる最良の方法は、UICollectionView関連の選択メソッドを呼び出して実行することです。
`` ''
-関係者はまた、直接設定しないことを提案しました。直接設定すると、思い通りの効果が得られない場合があります。私のテストの後、直接設定は機能しません。学生は自分でそれを行うことができます。やってみて
-秒:-[UICollectionView selectItemAtIndexPath:animated:scrollPosition:]
-このメソッドは、UICollectionViewオブジェクトメソッドを介してセルの選択された状態を設定するというAppleの公式の推奨事項である可能性があります。
-公式説明を見てみましょう



```objc If the allowsSelection property is NO, calling this method has no effect. If there is an existing selection with a different index path and the allowsMultipleSelection property is NO, calling this method replaces the previous selection.

このメソッドでは、選択に関連するデリゲートメソッドは呼び出されません。
allowSelectionプロパティがNOの場合、このメソッドを呼び出しても効果はありません。
選択された他のセルがあり(公式の説明は別のインデックス、同じ意味です)、allowsMultipleSelection(複数選択を許可)このプロパティがNOの場合、このメソッドを呼び出すと、そのセルの選択された状態が置き換えられます。
つまり、permissionsSelection = YES(デフォルトはYES)、allowsMultipleSelection = NO(これはデフォルト設定でもあります)の場合、このメソッドを呼び出すと、前のセルの選択された状態がキャンセルされ、現在のセルが選択されます。
`` ''

- After reading the official explanation, I believe everyone understands that it is just the property we need.

最終的解決

  • 要約すると、次の場合didSelectItemAtIndexPath: with didDeselectItemAtIndexPathこれらの2つのメソッドで呼び出されますreloadItemsAtIndexPathsまたはreloadDataこれらの2つのメソッドは、セルに表示されたデータを更新しますが、didDeselectItemAtIndexPathこのプロキシメソッドは呼び出されません。次の設定を行うだけで済みます。



    // These two properties are configured by default. If you have not modified them, you don't need to write them. allowsSelection = YES allowsMultipleSelection = NO - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

{{
//設定するコード
[collectionView selectItemAtIndexPath:indexPathアニメーション:NOscrollPosition:UICollectionViewScrollPositionNone]
}
`` ''