Swift:在切换视图后使用UILongPressGestureRecognizer时应用程序崩溃

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift:在切换视图后使用UILongPressGestureRecognizer时应用程序崩溃相关的知识,希望对你有一定的参考价值。

在我看来,我已经包含了两个不同的UIGestureRecognizer,UILongPressGestureRecognizer和UITapGestureRecognizer。一个是重新排列我的UICollectionView图像,另一个是简单点击,导致所选图像的详细视图。

一切都有效,但是一旦我在呈现详细的图像视图后返回到视图,每当我尝试拖动图像时应用程序就会崩溃。点击功能每次都有效,但是在开始拖动图像后立即发生崩溃。

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中。

有任何想法吗?非常感谢。

答案

在经历了几个小时的挣扎之后,我终于找到了造成这个问题的原因。它与手势无关,但与集合视图及其数据无关。在viewWillAppear()中,我通过将缩略图重新添加到数组来更新视图:

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

但由于某种原因,我忘记调用thumbnails.removeAll(),导致数据被复制,而不是在集合视图上调用reloadData(),导致它崩溃。

以上是关于Swift:在切换视图后使用UILongPressGestureRecognizer时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如果在 Parse 中找到,则输入邮政编码切换视图控制器(Swift 和 XCode)

在 SWIFT 中的不同视图之间切换

在 Swift 中以编程方式从 MainViewController 切换到 .xib 视图?

Swift - 分段控制 - 切换多个视图

在 Swift 中单击以编程方式切换到 TableViewCell 上的导航视图

使用单个按钮 Xcode 或 swift 切换视图控制器的背景颜色