3

我有一個UICollectionViewController類,它列出了一堆細胞。當用戶觸摸一個單元格時,我想使用touchesBegan方法來防止新的觸摸,直到第一次觸摸完成其單元格的選擇。touchesBegin在UICollectionViewController中沒有觸發

我試着把下面的代碼放在我的視圖控制器中,但它永遠不會被調用。

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

但是,在我的項目的其他地方,我有另一個類是UIViewController的子類。在那裏,我在下面的代碼中使用touchesBegan來關閉該類中文本視圖的鍵盤,並且該代碼被調用得很好。

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

爲什麼這段代碼在一個類中工作,而不是在另一個類中工作?我如何在我的UICollectionViewController中使用touchesBegan來檢測我的收藏視圖單元上的接觸?在斯威夫特解決方案將不勝感激。謝謝你的時間!

研究: 我檢查了此解決方案: Handle Touch in UiCollectionView? 但答案大多適用於具體的項目。

我嘗試使用手勢識別器來運行self.collectionView?.userInteractionEnabled = false,但手勢識別器不會爲selector.state == .Began觸發,僅適用於.Ended。所以我不能用它來防止進一步的觸動。

我也嘗試使用UILongPressGestureRecognizer做同樣的事情,但該手勢防止集合視圖單元格偵聽的默認點按手勢,所以定期點擊單元格從未收到,因此無法選擇單元格。

我發佈了一個解決方法作爲答案,雖然它沒有回答原來的問題。

+1

我懷疑你的一個單元可能不會將觸摸轉發給響應者鏈。如果你有自定義的集合視圖單元格,確保他們調用'super.touchesBegan ...' –

+1

我不知道爲什麼它不會調用(我認爲聖誕老人是在正確的路徑上),但是你可以改爲' var hasBeenTouched:Bool變量,在第一次運行代碼後設置爲「true」?然後要運行的代碼都放在'if hasBeenTouched == false'塊中。 – Tim

+1

@Tim - 我確實嘗試了這個想法。在'collectionView(:didSelectItemAtIndexPath)'中,如果'hasBeenTouched == false'我將它設置爲'true',禁止用戶交互,並運行一個塊來處理單元格選擇。在塊的結尾處,我將'hasBeenTouched'設置爲false,並啓用用戶交互。但由於某些原因,仍有可能在同一時間選擇2個細胞,這導致細胞選擇功能「鎖定」。我不明白爲什麼這種方法行不通。 – peacetype

回答

0

這是一種解決方法,但不是使用touchesBegan我使用了UICollectionViewDelegate協議,這適用於讓我選擇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)")