3

У меня есть класс UICollectionViewController, который выдает кучу ячеек. Когда пользователь касается ячейки, я хочу использовать метод touchesBegan для предотвращения новых касаний до тех пор, пока первое касание не завершит выбор ячейки.touchsBegan не стреляет в 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) 
} 

Почему этот код работает в одном классе, а не в другом? И как я могу использовать touchesBegan в моем UICollectionViewController, чтобы обнаружить штрихи на моих ячейках просмотра коллекции? Решения в Свифт были бы оценены. Спасибо за ваше время!

Исследование: Я проверил это решение: Handle Touch in UiCollectionView? Но ответы в основном относятся к этому конкретному проекту.

Я попытался использовать распознаватель жестов для запуска self.collectionView?.userInteractionEnabled = false, но распознаватель жестов не срабатывает для selector.state == .Began, только для .Ended. Поэтому я не мог использовать его, чтобы предотвратить дальнейшие штрихи.

Я также пробовал использовать UILongPressGestureRecognizer, чтобы сделать то же самое, но этот жест предотвращает стандартный жест нажатия, который прослушивают ячейки просмотра коллекции, поэтому регулярный щелчок по ячейкам так и не был получен, и поэтому ячейки не могут быть выбраны.

Я отправил обходной путь в качестве ответа, хотя он не отвечает на исходный вопрос.

+1

Я подозреваю, что одна из ваших камер не может перенаправлять цепь ответчика. Если у вас есть пользовательские ячейки просмотра коллекции, убедитесь, что они вызывают 'super.touchesBegan ...' –

+1

Я не знаю, почему он не звонит (я думаю, что Санта-Клаус находится на правильном пути), но вместо этого вы могли бы иметь ' var hasBeenTouched: переменная Bool', которая установлена ​​в 'true' после первого запуска кода? Затем выполняемый код помещается в блок if ifbboutTouched == false. – Tim

+1

@ Тим - Я попробовал эту идею. В '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)") 
Смежные вопросы