touchesBegan 未在 UICollectionViewController 中触发

touchesBegan not firing in UICollectionViewController

我有一个 UICollectionViewController class 可以布置一堆单元格。当用户触摸一个单元格时,我想使用 touchesBegan 方法来阻止新的触摸,直到第一次触摸完成它对单元格的选择。

我尝试将以下代码放入我的视图控制器中,但它从未被调用。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesBegan(touches, withEvent: event)
    print("touches began")
}

但是,在我项目的其他地方,我还有另一个 class,它是 UIViewController 的子class。在那里,我在以下代码中使用 touchesBegan 关闭 class 中的文本视图的键盘,并且该代码被调用得很好。

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    super.touchesBegan(touches, withEvent: event)
    view.endEditing(true)
}

为什么这段代码在一个 class 而不是另一个?我如何在我的 UICollectionViewController 中使用 touchesBegan 来检测我的集合视图单元格上的触摸? Swift 中的解决方案将不胜感激。感谢您的宝贵时间!

研究: 我检查了这个解决方案: 但答案主要适用于该特定项目。

我尝试使用手势识别器 运行 self.collectionView?.userInteractionEnabled = false,但手势识别器不会针对 selector.state == .Began 触发,仅针对 .Ended。所以我不能用它来防止进一步的接触。

我也尝试使用 UILongPressGestureRecognizer 来做同样的事情,但是那个手势阻止了集合视图单元格监听的默认点击手势,所以从来没有收到对单元格的常规点击,因此无法选择单元格。

我发布了一个解决方法作为答案,尽管它没有回答原始问题。

这是一种解决方法,但我没有使用 touchesBegan,而是使用了 UICollectionViewDelegate 协议,这让我 select 在 UICollectionView 中有一个单元格。

// The specified item should be selected.
override func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
    return true
}

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    colorIndex = (indexPath as NSIndexPath).item // sets color index to the selected cell's path
    let selectedCell = collectionView.cellForItem(at: indexPath) as UICollectionViewCell!
print("Cell selected: \(selectedCell)")