2017-07-11 7 views
0

セルの順序を変更したい。私が試してみると時々(遅れをとって)動作しますが、時々、私のアプリがクラッシュしました。 インターネットでどこでも検索しましたが、今までのところ答えを見つけることができませんでした。UICollectionビューセルを並べ替えるとスウィフトが起きる

func handleLongGesture(panRecognizer: UIPanGestureRecognizer){ 

    let locationPoint: CGPoint! = panRecognizer.locationInView(collectionView) 
    guard let selectedIndexPath : NSIndexPath = collectionView.indexPathForItemAtPoint(locationPoint) else { 
     return 
    } 
    if panRecognizer.state == .Began{ 

     collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath) 
     indexPathSelectedItem = selectedIndexPath 
    } 
    else if panRecognizer.state == .Changed{ 

     collectionView.updateInteractiveMovementTargetPosition(locationPoint) 

    } 
    else if panRecognizer.state == .Ended{ 

     collectionView.endInteractiveMovement() 
    } 
} 

これは私が試みている上記のコードです。私はコード全体でバグを見つけることができません。 私はブレークポイントを使用してアプリケーションがクラッシュした場所と、時には状態 "panRecognizer.state == .Ended"の下にあることができないことがわかった場所を見つけようとしたことをお知らせしたいと思います私のアプリはクラッシュする。 、あなたはあなたの方法の上部にある美しいガード文を持って

まず:クラッシュなし

+1

どこsymbolicatedクラッシュログがありますか?どのコード行がクラッシュするの? –

+0

クラッシュログも追加できますか? – Thomas

答えて

0

は、一方でいくつかの提案があり、ここでそれが起こって正確に何を言うのは難しいのログが、 let locationPoint: CGPoint! = panRecognizer.locationInView(collectionView)を追加することをお勧めします。この方法では、強制的にアンラップする必要はなく、コードはこの特定のクラッシュから保護されます。

第二:あなたのコレクションビューのendInteractiveMovement()メソッドを呼び出すと

、それは順番に、今、あなたのデータソースを更新し、そこにもアイテムを移動する必要があることをできるように、あなたのデリゲートメソッドcollectionView:moveItemAtIndexPath:toIndexPath:を呼び出します。

これを実装して問題のオブジェクトを適切な場所に移動したことを確認してください。そうでなければ、データソースがコレクションビューと同期していないため、アプリケーションがクラッシュします。

サード

私はあなたが他のすべての可能な状態をキャッチする代わりのif-elseのswitchステートメントを使用することをお勧め、これはあなたが右やっていない移動アクションを(キャンセルする可能性を提供します今):

switch(panRecognizer.state) { 

    case UIGestureRecognizerState.Began: 
     // Begin movement 
     collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath) 
    indexPathSelectedItem = selectedIndexPath 

    case UIGestureRecognizerState.Changed: 
     // Update movement 
     collectionView.updateInteractiveMovementTargetPosition(locationPoint) 

    case UIGestureRecognizerState.Ended: 
     // End movement 
     collectionView.endInteractiveMovement() 

    default: 
     collectionView.cancelInteractiveMovement() 
    } 

}

関連する問題