带有手势识别器的 UICollectionView

Posted

技术标签:

【中文标题】带有手势识别器的 UICollectionView【英文标题】:UICollectionView with gesture recogniser 【发布时间】:2016-05-11 18:47:11 【问题描述】:

我有一个 UICollectionView,它附有一个长按手势。当我按下一个单元格时它工作正常,但如果触摸区域不是一个单元格,则应用程序崩溃并显示 EXC_BREAKPOINT

它崩溃了

if let indexPath : NSIndexPath = collectView.indexPathForItemAtPoint(point)!  

线。我相信我需要检查该点实际上是一个单元格,但我不确定要检查什么

代码如下

@IBAction func longPressCell(sender: UILongPressGestureRecognizer) 
    if (sender.state == UIGestureRecognizerState.Began) 
        if let point : CGPoint = sender.locationInView(self.collectionView) 
            if let collectView = self.collectionView 
                if let indexPath : NSIndexPath = collectView.indexPathForItemAtPoint(point)! 
                    let adopt : UserPet = self.fetchedResultsController.objectAtIndexPath(indexPath) as! UserPet
                    NSLog("Adopt: \(adopt)")
                
            
        

    

【问题讨论】:

我认为问题可能是如果您触摸单元格外部,则通过 indexPathForItemAtPoint() 返回的索引路径为零,并且您使用 !运算符,不能用于缺失 (nil) 值。您应该首先检查返回的值是否不为零,然后继续,并且 - 根据您的业务逻辑 - 如果您不需要在单元格之外处理它,则丢弃该手势。 对上述内容进行编辑:我认为您需要删除 !操作员在行尾,使其正常工作。尽管“条件绑定的初始化程序必须具有可选类型,而不是'NSIndexPath'”,但您不应该有编译器警告/错误吗? 谢谢,用 if collectView.indexPathForItemAtPoint(point) != nil 解决了 【参考方案1】:

collectView.indexPathForItemAtPoint(point) != nil 解决了

【讨论】:

以上是关于带有手势识别器的 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

带有平移手势识别器的UICollectionViewCell

手势识别器在其他 UICollectionViewCell 内的 UICollectionView 上不起作用

具有 UIView 作为子视图的 UICollectionView 的选择性手势识别

UICollectionView的选择性手势识别,UIView为子视图

如何覆盖 UICollectionView 中的 handlePan 选择器

在 UICollectionView 上禁用单元格重用