2017-12-15 16 views
0

コレクションview.itsでドラッグ&ドロップ機能を使用していますが、ユーザーがセルを別の位置にトラップするときに配列の値を置き換えると、コレクションビューが再表示されます。ドラッグアンドドロップセル0と1のコレクションビューはすべてのセルをリロードせず、1つのセルだけをリロードします。コレクションビューは毎回リロードされません

私のコードで何が問題なのか分かりません。 以下は私のコードです。

longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.handleLongGesture(gesture:))) 
     collection_view.addGestureRecognizer(longPressGesture) 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    { 
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell_images", for: indexPath) as! AddImagesCollectionViewCell 
      cell.layer.borderWidth=1 
      if Details.Images[indexPath.item].sourceType == sourceType.URL 
      { 
       cell.img_images.downloadedFrom(link: Details.Images[indexPath.item].imageURL!, contentMode: .scaleAspectFill) 
      } 
      else 
      { 
       cell.img_images.image = Details.Images[indexPath.item].image 
      } 
      Details.Images[indexPath.row].sequence="\(indexPath.row + 1)" 

      return cell 

    } 
func collectionView(_ collectionView: UICollectionView, canMoveItemAt indexPath: IndexPath) -> Bool 
    { 
     if indexPath.row == Details.Images.count 
     { 
      return false 
     } 

     return true 
    } 

    func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) 
    { 
     print("Starting Index: \(sourceIndexPath.item)") 
     print("Ending Index: \(destinationIndexPath.item)") 
     let tempArray = Details.Images[sourceIndexPath.item] 
     Details.Images.remove(at: sourceIndexPath.item) 
     Details.Images.insert(tempArray, at: destinationIndexPath.item) 
     collectionView.reloadData() 

    } 

    @objc func handleLongGesture(gesture: UILongPressGestureRecognizer) 
    { 
     switch(gesture.state) 
     { 
     case .began: 
      guard let selectedIndexPath = collection_view.indexPathForItem(at: gesture.location(in: collection_view)) 
       else 
      { 
       break 
      } 
      if !(selectedIndexPath.row == Details.Images.count) 
      { 
       collection_view.beginInteractiveMovementForItem(at: selectedIndexPath) 
      } 
     case .changed: 
      guard let selectedIndexPath = collection_view.indexPathForItem(at: gesture.location(in: collection_view)) 
       else 
      { 
       break 
      } 
      if !(selectedIndexPath.row == Details.Images.count) 
      { 
       collection_view.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!)) 

      } 
     case .ended: 
      collection_view.endInteractiveMovement() 
     default: 
      collection_view.cancelInteractiveMovement() 
     } 
    } 

答えて

2

あなたのコードにはバグがありません、あなたがendInteractiveMovement()後にreloadDataを()を呼び出すために必要なすべてのコレクションビューをリロードしたい.IF、collectionViewは一つだけのセル(あなたがdragedているもの)をリロードします。

+0

しかし、しばらくすると、すべてのセルがリロードされます。 –

+0

endInteractiveMovement()で呼び出しを再ロードした後に機能しない –

+0

collectionView.reloadData()をcollectionViewに書き込むと、時間が再ロードされる:moveItem ...何らかの理由で並べ替えがキャンセルされたと思われる場合は、collection_view.cancelInteractiveMovement()これを確認し、取り消し後にreloadData()を追加してください。 –

関連する問題