touchesBegan не срабатывает в UICollectionViewController

У меня есть класс UICollectionViewController, который выкладывает кучу ячеек. Когда пользователь касается ячейки, я хочу использовать метод touchesBegan, чтобы предотвратить новые касания, пока первое касание не завершит выбор ячейки.

Я попытался поместить следующий код в свой контроллер представления, но он никогда не вызывается.

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 для обнаружения прикосновений к ячейкам просмотра моей коллекции? Решения в Swift будут оценены. Спасибо за ваше время!

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

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

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

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


person peacetype    schedule 08.11.2015    source источник
comment
Я подозреваю, что одна из ваших ячеек может не пересылать ретушь по цепочке респондентов. Если у вас есть настраиваемые ячейки представления коллекции, убедитесь, что они вызывают super.touchesBegan...   -  person Andrew    schedule 08.11.2015
comment
Я не знаю, почему он не звонит (я думаю, что Санта-Клаус на правильном пути), но не могли бы вы вместо этого иметь переменную var hasBeenTouched : Bool, которая устанавливается в true после первого запуска кода? Затем весь код для запуска помещается в блок if hasBeenTouched == false.   -  person Tim    schedule 08.11.2015
comment
@ Тим - я попробовал эту идею. В collectionView(:didSelectItemAtIndexPath), если hasBeenTouched == false я устанавливаю его в true, отключаю взаимодействие с пользователем и запускаю блок для обработки выбора ячейки. В конце блока я возвращаю hasBeenTouched значение false и разрешаю взаимодействие с пользователем. Но по какой-то причине все еще возможно, чтобы 2 ячейки были выбраны одновременно, что приводит к блокировке функции выбора ячейки. Я действительно не понимаю, почему этот подход не работает.   -  person peacetype    schedule 08.11.2015
comment
@SantaClaus - у меня есть пользовательские ячейки представления коллекции. Чтобы сделать вызов super.touchesBegan для ячеек, должен ли я сделать этот вызов в методе collectionView:cellForItemAtIndexPath: моего подкласса UICollectionViewController?   -  person peacetype    schedule 08.11.2015
comment
Вы читали документацию [здесь?][1] [1]: developer.apple.com/library/ios/documentation/UIKit/Reference/: вы должны переопределить все методы или ни один из них. Может быть, это разница в ваших двух контроллерах.   -  person Tim    schedule 09.11.2015
comment
@Tim. В нем говорится: Если вы переопределяете этот метод без вызова super, вы также должны переопределять другие методы для обработки событий касания, хотя бы в виде заглушек (пустых) реализаций. Однако я вызываю super в мой код выше, в обоих контроллерах. Я также попытался переопределить все 5 методов (и вызвал в них super), но ни один из них не был вызван. Должно быть что-то еще. Я прочитал некоторые связанные вопросы, которые, казалось, подразумевают, что для этого должно быть какое-то сообщение, проходящее по цепочке получателей. Так что, может быть, я должен изучить это больше.   -  person peacetype    schedule 11.11.2015


Ответы (1)


Это своего рода обходной путь, но вместо использования 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)")
person peacetype    schedule 21.12.2017