私はUIViewController
にUICollectionView
を持っています。私はジェスチャ認識プログラムを設定して細胞を移動させました。それは、端を除く任意のインデックスにセルを移動するために正常に動作します。私が最後にセルを移動しようとすると、最も重大なことに、アプリケーションはクラッシュしません - それはちょうどハングアップします。私はReorderViewController
から戻ってそれに戻ることができます。ビューは正常にリロードされます。問題の移動CollectionViewCellを最後に
私はジェスチャー認識を設定するには、viewDidLoad
からこのメソッドを呼び出します。
func configureGestureRecognizer() {
// configure longPressGestureRecognizer
longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ReorderViewController.handleLongPressGesture))
longPressGesture.minimumPressDuration = 0.5
longPressGesture.delegate = self
self.collectionView.addGestureRecognizer(longPressGesture)
}
UILongPressGestureRecognizer
がトリガされると、そのハンドラが呼び出されます。
func handleLongPressGesture(gesture: UILongPressGestureRecognizer) {
guard let selectedIndexPath = self.collectionView.indexPathForItem(at: gesture.location(in: self.collectionView)) else {
return
}
let selectedCell = collectionView.cellForItem(at: selectedIndexPath)
switch gesture.state {
case .began:
print("began")
editMode = true
collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)
selectedCell?.isSelected = true
case .changed:
editMode = true
selectedCell?.isSelected = true
print("changed")
collectionView.updateInteractiveMovementTargetPosition(gesture.location(in: self.collectionView))
case .ended:
print("ended")
editMode = false
selectedCell?.isSelected = false
collectionView.endInteractiveMovement()
default:
print("default")
editMode = false
selectedCell?.isSelected = false
collectionView.cancelInteractiveMovement()
}
}
私はどんなことなく、ジェスチャーで細胞を移動することができます私が最後まで動かない限り、トラブルが起きる。最も厄介なことに、アプリはクラッシュしない - ちょうどハングアップします。 NavBarの「戻る」ボタンを押して、以前のViewControllerに移動して、クラッシュすることなくReorderViewControllerに戻ることができます。ここで
は、セルを移動するための私のコードです:
func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let stuffToReorder = currentRoutine?.myOrderedSet.mutableCopy() as! NSMutableOrderedSet
stuffToReorder.exchangeObject(at: sourceIndexPath.row, withObjectAt: destinationIndexPath.row)
currentRoutine?.myOrderedSet = stuffToReorder as NSOrderedSet
appDelegate.saveContext()
}
任意の考えを再:私のミスが大幅に高く評価されている場合。
こんにちはアドリアン - 私は(50イントを含むNSOrderedセットを使用して)遊び場で上記を再現しました。あなたのコードでは問題ありませんが、ここでNSOrderedSetを使用している特別な理由はありませんか?私が再作成できないのは、currentRoutineへの参照だけでなく、appDelegate.saveContext呼び出しで少しぼんやりとしています。これらが何であるか、プロジェクトでの役割についてもう少し詳しく説明できますか? – Sparky
@ Sparky見てくれてありがとう! 'currentRoutine'はNSManagedObjectsのNSOrderedSetです。私は物理的なデバイスでそれを試して、私はそこにバグを複製することができます。 「フリーズ」は、オブジェクトを他のセルの範囲を超えてドラッグすると発生します。 'appDelegate.saveContext()'コールは、 'myOrderedSet'の順序が変更されたときにNSManagedObjectを保存することです。 – Adrian