2

タイトルは私が得たエラーであり、その理由はわかりませんが、ここにいくつかの情報があるので、ここの誰かが私を解明できることを願っています.

これにより、セル自体のフレームを計算する必要がなくなるため、サブクラス化UICollectionViewFlowLayoutしました(おそらくこれは問題ですか?)prepareLayout. 次に、UICollectionViewLayoutAttributes情報を使用して、それを重ねる補足ビューを計算し、希望するレイアウトを取得します。

performBatchUpdates:completion:ビューを追加、削除、更新するために使用します。挿入は正常に機能しますが、アイテムの削除は、タイトルに示されているエラーが表示された場合です。

エラーが発生する理由はわかっていますが、なぜ発生する必要があるのか​​ わかりませ。問題を引き起こすシナリオの例で明確にする

  1. 1 補足ビュー 1 セクションで 1 項目から開始
  2. さらに 2 つのアイテムを追加します ( 3 つのprepareLayoutアイテムと 3 つの補足ビューを参照)
  3. アイテムの削除 ( prepareLayout2 つのビューと 2 つの補足ビューが表示されます)
  4. layoutAttributesForSupplementaryViewOfKind:atIndexPath:section:0 と item:2のインデックス パスの属性を要求するように呼び出されます
  5. 以前に 2 つのアイテムと 2 つの補足ビューを設定する準備レイアウトを呼び出したにもかかわらず、3 つ目の補足ビューの属性を要求したためにクラッシュしました。
  6. 諦めと絶望に手を上げて

私が知る限り、問題のある機能は次のとおりです。

- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
{
    return self.layoutInfo[elementKind][indexPath];
}

もちろん、これはの内部ネットワークによって自動的に呼び出されるUICollectionViewため、そのインデックス パスでその補足ビューを要求している理由がわかりません。

誰でもアイデアはありますか?おそらくそれは私の使い方performBatchUpdates:completion:ですが、補足ビューを追加するまで削除はうまくいきました。必要に応じて、より多くのコード/説明を提供できます。

4

2 に答える 2

4

私は答えを探してフォーラムを精査し、いくつかの提案に出くわしました. それらのどれも私が必要とする助けを与えてくれませんでした.最終的には、締め切りに間に合わせるために、補足ビューの使用を完全にやめました.

数週間後、好奇心からもう一度見回したところ、最終的に次の投稿に出くわし、今では再び補足ビューを使用しています.

したがって、次のものを忘れずに返却してください。

- (NSArray<NSIndexPath *> *)indexPathsToDeleteForSupplementaryViewOfKind:(NSString *)elementKind
{
    return self.removedIndexPaths;
}

コレクション ビューのレイアウトに。

于 2016-07-10T07:57:07.190 に答える
2

クラッシュを防ぐために、無効になったすべての indexPath に対してダミーの属性を返すことができます。このようなものがクラッシュを防ぐのに役立ちます:

UICollectionViewLayoutAttributes *layoutAttributes = self.layoutInfo[elementKind][indexPath]; // add some safety checks if this access creates an out of bounds issue

// create dummy layoutAttributes
// the workaround
if (layoutAttributes == nil) {
    UICollectionViewLayoutAttributes *dummyLayoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath];
    dummyLayoutAttributes.frame = CGRectZero;
    dummyLayoutAttributes.hidden = YES;
    layoutAttributes = dummyLayoutAttributes;
}

return layoutAttributes;

これにより、ビュー スタック内にあるはずのないオブジェクトが表示されますが、それらは隠されているため、クラッシュは発生しません。次回UICollectionViewレイアウトを更新すると、古い非表示のビューが消去されます。

于 2016-07-10T07:53:18.810 に答える