2017-12-23 43 views
-1

私の見解では、2つの異なるUIGestureRecognizers、UILongPressGestureRecognizer、およびUITapGestureRecognizerが含まれています。 1つは画像のUICollectionViewを並べ替えるためのもので、もう1つはシンプルなタップ用であり、選択した画像の詳細な表示につながります。Swift:ビューの切り替え後にUILongPressGestureRecognizerを使用するとアプリケーションがクラッシュする

すべてが最初に機能しますが、詳細な画像ビューを表示した後でビューに戻ると、画像をドラッグしようとするとアプリがクラッシュします。タッピング機能は毎回機能しますが、クラッシュが発生した画像のドラッグを開始した直後です。

override func viewDidLoad() { 
    super.viewDidLoad() 

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

    self.tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTapGesture(gesture:))) 
    self.tapGesture.delegate = self 

    collectionView?.addGestureRecognizer(self.longPressGesture) 
    collectionView?.addGestureRecognizer(self.tapGesture) 
} 

マイタップ機能:

@objc func handleTapGesture(gesture: UITapGestureRecognizer) { 
    self.performSegue(withIdentifier: "displayImage", sender: self) 
} 

そして、私の長押し機能:

@objc func handleLongGesture(gesture: UILongPressGestureRecognizer) { 
    switch(gesture.state) { 
    case .began: 
     print("begin hold!") 
     guard let selectedIndexPath = self.collectionView?.indexPathForItem(at: gesture.location(in: self.collectionView)) else { 
      break 
     } 
     self.collectionView?.beginInteractiveMovementForItem(at: selectedIndexPath) 
    case .changed: 
     print("change hold!") 
     self.collectionView?.updateInteractiveMovementTargetPosition(gesture.location(in: gesture.view!)) 
    case .ended: 
     print("end hold!") 
     UIView.performWithoutAnimation { 
      self.collectionView?.endInteractiveMovement() 
     } 
    default: 
     print("cancel hold!") 
     self.collectionView?.cancelInteractiveMovement() 
    } 
} 

クラッシュしたとき、私が取得

のlibC++ abi.dylib:未知のタイプの例外で終了する NSException

これは、func handleLongGesture()に埋め込まれた.changed-caseで発生すると考えられます。

アイデア?大変感謝しています。

+0

ジェスチャをコレクションビューに追加するのは良い考えではありません。また、コレクションのビューからhandleLongGestureコールを呼び出す方法を示すことさえできません。 –

+0

これは、UILongPressGestureRecognizerを使用してコレクションビューセルの並べ替えを処理する標準的な方法のようです。 UITapGestureRecognizerを使用する理由は、UILongPressGestureRecognizerとUICollectionViewCell didSelectItemAtIndexPathの間の競合が原因です。関数呼び出しは、viewDidLoad()で行われるコレクションビューにジェスチャ認識器を含めることによって行われます。 – drante

答えて

0

これを数時間長く苦労して、私はついにこの問題の原因を突き止めました。ジェスチャーとは関係がありませんでしたが、コレクションビューとそのデータがありました。 viewWillAppear()で、私は、配列にサムネイルを再追加することによって、ビューを更新:

self.thumbnails.removeAll() 
    for i in 0 ..< self.images.count { 
     ... adding new (updating) thumbnails ... 
} 

しかし、いくつかの理由で、私はデータがない一方で複製させる、thumbnails.removeAll()を呼び出すことを忘れていましたコレクションビューでreloadData()を呼び出し、クラッシュさせます。

関連する問題