私の見解では、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で発生すると考えられます。
アイデア?大変感謝しています。
ジェスチャをコレクションビューに追加するのは良い考えではありません。また、コレクションのビューからhandleLongGestureコールを呼び出す方法を示すことさえできません。 –
これは、UILongPressGestureRecognizerを使用してコレクションビューセルの並べ替えを処理する標準的な方法のようです。 UITapGestureRecognizerを使用する理由は、UILongPressGestureRecognizerとUICollectionViewCell didSelectItemAtIndexPathの間の競合が原因です。関数呼び出しは、viewDidLoad()で行われるコレクションビューにジェスチャ認識器を含めることによって行われます。 – drante