2016-08-04 60 views
1

要移動UICollectionView中的項目我使用UILongPressGestureRecognizer。在平移期間UICollectionView單元格在各節之間移動不正確

我採取了以下手勢處理機:

func handleLongGesture(gesture: UILongPressGestureRecognizer) { 
    switch(gesture.state) { 
    case UIGestureRecognizerState.Began: 
     guard let selectedIndexPath = self.collectionView.indexPathForItemAtPoint(gesture.locationInView(self.collectionView)) else {break} 
     collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath) 
    case UIGestureRecognizerState.Changed: 
     collectionView.updateInteractiveMovementTargetPosition(gesture.locationInView(gesture.view!)) 
    case UIGestureRecognizerState.Ended: 
     collectionView.endInteractiveMovement() 
    default: 
     collectionView.cancelInteractiveMovement() 
    } 
} 

加上集合視圖委託方法moveItemAtIndexPath的正確的覆蓋,移動部分中的細胞可以完美運行。此外,將細胞移動到其他可見部分也可按預期工作。

'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of items in section 0. The number of items contained in an existing section after the update (1) must be equal to the number of items contained in that section before the update (0), plus or minus the number of items inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).' 

問題似乎涉及到的位置變化被跟蹤:然而,在移動細胞到成爲平移/向下滾動,導致下面的錯誤(我用了一個域數據庫)可見部分時發生的問題手勢識別器updateInteractiveMovementTargetPosition因爲在這種方法中發生錯誤。

我想updateInteractiveMovementTargetPosition直接調用集合視圖方法moveItemAtIndexPath(不通過委託),這會導致錯誤,因爲中間單元格位置更改沒有在Realm數據庫中更新。還是我不正確?

有人會知道爲什麼在部分之間移動對可見部分起作用,但在平移時不起作用?如何正確處理滾動/平移?

回答

0

UICollectionView &當在UI狀態中進行更新並要求將這些更新鏡像到數據源中時,UITableView API非常無情。

您需要更新Realm以反映UI狀態,以保持UICollectionView的快樂。

下面是與重新排序的細胞領域支持的UITableViewController,你可以爲你的UICollectionView用例適應的例子:

import UIKit 
import RealmSwift 

class ObjectList: Object { 
    let list = List<DemoObject>() 
} 

class DemoObject: Object { 
    dynamic var title = "" 
} 

class TableViewController: UITableViewController { 
    var items: List<DemoObject>? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") 
     tableView.editing = true 

     let realm = try! Realm() 
     if realm.isEmpty { 
      try! realm.write { 
       let list = ObjectList() 
       list.list.appendContentsOf(["one", "two", "three"].map { 
        DemoObject(value: [$0]) 
       }) 
       realm.add(list) 
      } 
     } 
     items = realm.objects(ObjectList.self).first!.list 
    } 

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int { 
     return items?.count ?? 0 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 
     cell.textLabel?.text = items?[indexPath.row].title 
     return cell 
    } 

    override func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle { 
     return .None 
    } 

    override func tableView(tableView: UITableView, shouldIndentWhileEditingRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
     return false 
    } 

    override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { 
     guard let items = items else { return } 
     try! items.realm?.write { 
      let itemToMove = items[fromIndexPath.row] 
      items.removeAtIndex(fromIndexPath.row) 
      items.insert(itemToMove, atIndex: toIndexPath.row) 
     } 
    } 
} 
+0

這是我基本上是一個集合視圖實現,並在的情況下沒有問題的作品單節(在表格視圖中也適用於具有適當的'moveRowAtIndexPath'的多節)。我遇到的問題僅在將移動單元移動到多節集合視圖中某個節的最後一個單元之後(單節沒有錯誤發生)時發生。我發佈了一些代碼,可以在[github](https://github.com/Taco55/CollectionViewCellMoving)上重現此錯誤。這可能是Swift中的 錯誤還是我錯誤地更新數據庫?任何幫助,將不勝感激 – Taco

相關問題