У меня есть класс 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
, чтобы сделать то же самое, но этот жест предотвращает жест касания по умолчанию, который прослушивают ячейки представления коллекции, поэтому обычное нажатие на ячейки никогда не было получено, и поэтому ячейки не могут быть выбраны.
Я опубликовал обходной путь в качестве ответа, хотя он не отвечает на исходный вопрос.
super.touchesBegan...
- person Andrew   schedule 08.11.2015var hasBeenTouched : Bool
, которая устанавливается вtrue
после первого запуска кода? Затем весь код для запуска помещается в блокif hasBeenTouched == false
. - person Tim   schedule 08.11.2015collectionView(:didSelectItemAtIndexPath)
, еслиhasBeenTouched == false
я устанавливаю его вtrue
, отключаю взаимодействие с пользователем и запускаю блок для обработки выбора ячейки. В конце блока я возвращаюhasBeenTouched
значение false и разрешаю взаимодействие с пользователем. Но по какой-то причине все еще возможно, чтобы 2 ячейки были выбраны одновременно, что приводит к блокировке функции выбора ячейки. Я действительно не понимаю, почему этот подход не работает. - person peacetype   schedule 08.11.2015super.touchesBegan
для ячеек, должен ли я сделать этот вызов в методеcollectionView:cellForItemAtIndexPath:
моего подклассаUICollectionViewController
? - person peacetype   schedule 08.11.2015