2016-09-08 11 views
1

UICollectionViewからセルを削除しようとしています。私はカスタムレイアウトを使用しています。削除は、コレクションビューに追加した長い押しジェスチャ認識機能に応答して行われます。私が読んだところでは、まずデータソースを更新してから、セルを削除する必要があります。これは私が行うことです。すべてがスムーズにself.collectionView?.deleteItemsAtIndexPaths([indexPath])まで続きます。UICollectionViewセルの削除

***キャッチされていない例外 'NSInternalInconsistencyException'が原因でアプリを終了する理由: 'UICollectionViewは、存在しないインデックスパスを持つセルのレイアウト属性を受け取りました:{length = 2、path = 0 - 0} '

私は他の同様の質問を読んだことがありますが、それを働かせるようには見えません。

let book = self.booksForCurrentAuthor[indexPath.row] 

self.booksForCurrentAuthor.removeAtIndex(indexPath.row) 
self.collectionView?.deleteItemsAtIndexPaths([indexPath]) 

//Delete book from database 

編集

私はこれが関連しているとは思わないが、私のカスタムレイアウトオブジェクトに、私はprepareLayout()メソッド内からUICollectionViewLayoutAttributesのキャッシュを作成します。キャッシュは、ヘッダー、セル、フッター、およびデコレーションビューの属性用に別々の配列を持つディクショナリです。

+0

UICollectionViewを使用する場合は、 'indexPath.item'を使用してください。 –

+0

変更を加えました - 多少の標準コレクションビューレイアウトを使用すると機能的に違いはありますか? – cweber105

+0

なしどちらもパス内の2番目のインデックスの便利なアクセサです。 –

答えて

2

あなたのケースでは、そのようなものになるだろう。

collectionViewからセルを削除すると、既存のレイアウトを無効にする必要があります。そうしないと、レイアウトマネージャは元々計算したキャッシュ内の同じ属性配列を持ちますしたがって、エラーが削除されました。

データソースから関連するエントリを削除したら、cache.removeAll()を呼び出してから、prepareLayout()を再度呼び出してレイアウトキャッシュを更新します。その後、collectionView.reloadData()(おそらくlayoutSubviews()とsetNeedsDisplay)を呼び出して、問題を解決する必要があります。 collectionViewがデキューされたセルのスタックから必要なものを自動的にロードするので、実際にはセルを削除する必要はありません。

あなたがどのように乗っているか教えてください。すべてのベスト。

+0

これは本質的に正しいです。カスタムレイアウトをうまく設計していないため、データが変更されたときに属性を動的に再作成して配信することはありませんでした。データの変更を考慮する方法をいくつか更新したところ、うまくいきました。ありがとうございました。 – cweber105

0

Delete cell from UICollectionViewから解決策を試しましたか?私はあなたのカスタムレイアウトマネージャは、実際にも問題になることができると思い

[self.collectionView performBatchUpdates:^{ 
     let book = self.booksForCurrentAuthor[indexPath.row] 
     self.booksForCurrentAuthor.removeAtIndex(indexPath.row) 
     self.collectionView?.deleteItemsAtIndexPaths([indexPath]) 
    } completion:nil]; 
+0

はい。同じエラー。 – cweber105

関連する問題