2017-06-11 3 views
0

私のcollectionViewのデータを保持するデータオブジェクトを更新しようとしています(単にデータモデルをフィルタリングするだけです)。そして、フィルタされたデータでcollectionViewを再ロードしたいとします。リロードが発生したときに、取得しているコレクションビューを再ロードする際に問題が発生し、範囲外のindexPathが発生します。 collectionViewが、元のデータオブジェクトを再ロードしようとしているのではなく、元のデータオブジェクトを再ロードしようとしていることをデバッグしているようです。何が私が間違ってやっている:データを更新してCollectionViewを再ロードする

func handleFilterAction(sender: FilterButton){ 
    guard let type = sender.buttonFilterType else {return} 
    switch type { 
    case .FilterAll: 
     return 
    case .FilterDay: 
     return 
    case .FillterWeek: 
     return 
    case .FilterMonth: 
     collectionView?.performBatchUpdates({ 
      let objects = FilterDataManager.filterDataWith(currentLocalData: &self.eventObjects, filterOption: .ThisMonth) 
      self.eventObjects.removeAll() 
      self.eventObjects = objects 
     }, completion: { (completion) in 
      self.navigationItem.title = "This Month" 
      self.collectionView?.reloadData() 
     }) 
    } 

    self.handleShowFilterView() 

} 

eventObjectsがcollectionViewは、データのために読むべきものです:あなたがcollectionViewへの変更をアニメーション化するとき

override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return eventObjects[section].sectionObjects.count 
} 

答えて

0

あなたはperformBatchUpdatesを呼び出します。 iOSでは、collectionView?.insertItems(at: [IndexPath])collectionView?.deleteItems(at: [IndexPath])などのメソッドを呼び出して、挿入や削除をアニメーション化できるようにすることを期待しています。これら両方の呼び出しでは、IndexPathのすべての配列を挿入または削除して渡します。

これを行うと、iOSは現在collectionViewにあるアイテムの数に期待しています。式は次のとおりです。あなたの場合は

newItemCount = previousItemCount - deletedItemCount + insertedItemCount 

、あなたのモデルを変更していますが、insertItemsdeleteItemsメソッドを呼び出されることはありませんので、iOSのは、まだすべての項目があると考えています。 モデルと問題の原因となっているcollectionViewとの間の切断です。

は、この問題を解決するには、次のいずれかを実行する必要があります:あなたが削除して挿入されている IndexPathの配列と

  1. コールdeleteItemsinsertItemsを(最初の削除を呼び出します)。
  2. performBatchUpdatesを忘れてモデルデータを更新し、reloadDataに電話してください。

また、numberOfSectionseventObjects.countを返すようにしてください。

+0

私はperformBatchUpdates()呼び出しを削除しましたので、モデルで更新が実行された後でもreloadData()を呼び出すだけですが、デバッグ時には同じエラーが発生します。データで更新され、最初のセクションは正しく表示されますが、まだ2番目のセクションがあると思われます。 – bb2110

+0

であり、更新されたオブジェクトモデルはフィルタリングしたものだけを有する。 – bb2110

+0

フィルタリングが1つのセクションのデータを残すことを期待していましたか? – vacawama

関連する問題