我有一個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
做同樣的事情,但該手勢防止集合視圖單元格偵聽的默認點按手勢,所以定期點擊單元格從未收到,因此無法選擇單元格。
我發佈了一個解決方法作爲答案,雖然它沒有回答原來的問題。
我懷疑你的一個單元可能不會將觸摸轉發給響應者鏈。如果你有自定義的集合視圖單元格,確保他們調用'super.touchesBegan ...' –
我不知道爲什麼它不會調用(我認爲聖誕老人是在正確的路徑上),但是你可以改爲' var hasBeenTouched:Bool變量,在第一次運行代碼後設置爲「true」?然後要運行的代碼都放在'if hasBeenTouched == false'塊中。 – Tim
@Tim - 我確實嘗試了這個想法。在'collectionView(:didSelectItemAtIndexPath)'中,如果'hasBeenTouched == false'我將它設置爲'true',禁止用戶交互,並運行一個塊來處理單元格選擇。在塊的結尾處,我將'hasBeenTouched'設置爲false,並啓用用戶交互。但由於某些原因,仍有可能在同一時間選擇2個細胞,這導致細胞選擇功能「鎖定」。我不明白爲什麼這種方法行不通。 – peacetype