У меня есть представление коллекции, которое загружает список продуктов, и в нем нет никаких необычных функций. Он просто загружает данные из API. Проблема в том, что когда я пытаюсь нажать на один из элементов в представлении коллекции
collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
не звонят. Но когда я долго нажимаю на ячейку, она вызывается.
Я почти уверен, что к ячейке не применяются жесты.
Может ли кто-нибудь дать мне несколько рекомендаций по решению этой проблемы.
База кода, которая у меня есть, выглядит следующим образом
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cellTapped = (self.storeSearchListingCollectionViewOutlet.cellForItem(at: indexPath)) as! StoreSearchProdListingCollectionViewCell
UStoreShareClass.storeSharedInstance.longTappedProductID = String(cellTapped.tag)
if ((UStoreShareClass.storeSharedInstance.longTappedProductID) != nil)
{
self.performSegue(withIdentifier: "searchToProductDetailSegue", sender: self)
}
else
{
SetDefaultWrappers().showAlert(info:SERVER_DOWN_ERROR_ALERT, viewController: self)
}
}
Просмотр иерархии выглядит следующим образом
Заранее спасибо...!!!
Лучше использовать отладку представления и проверить, есть ли какое-либо представление поверх contententView collectionviewCell. Убедитесь, что вы перезагружаете collectionView на mainThread
@iOSGeek Добавлен экран иерархии представлений, о котором идет речь
@Pandey_Laxman Didselect функция делегата вызывается, когда я нажимаю ячейку на 3/4 секунды ...
Вы применили «TapGesture» в главном окне или в просмотре коллекции?
@Gati В представлении или представлении коллекции нет распознавателей жестов
@JobinsJohn захватывает рабочий экран на симуляторе или устройстве в режиме отладки, а затем проверьте.
пройдите пожалуйста по этой ссылке stackoverflow.com/questions/17700437/…





Это сделано намеренно. На раскадровке перейдите в представление коллекции и снимите флажок "Задержка касания" в инспекторе атрибутов.

Прежде всего, установите точку останова в условии if и проверьте, попадает ли она внутрь блока didselect. Потом,
Попробуйте добавить свой код выполнения в основной поток, как показано ниже.
if ((UStoreShareClass.storeSharedInstance.longTappedProductID) != nil)
{
DispatchQueue.main.async
{
self.performSegue(withIdentifier: "searchToProductDetailSegue", sender: self)
}
}
else
{
SetDefaultWrappers().showAlert(info:SERVER_DOWN_ERROR_ALERT, viewController: self)
}
Он не достигает метода делегата didSelect
Причин может быть две:
1) Возможно, первая причина:
К сожалению, ваш код не заставляет основной поток работать с пользовательским интерфейсом. Таким образом, вы должны поместить свою часть, связанную с пользовательским интерфейсом, в ОСНОВНОЙ поток следующим образом.
DispatchQueue.main.async {
// PUT YOUR CODE HERE
if ((UStoreShareClass.storeSharedInstance.longTappedProductID) != nil)
{
self.performSegue(withIdentifier: "searchToProductDetailSegue", sender: self)
}
else
{
SetDefaultWrappers().showAlert(info:SERVER_DOWN_ERROR_ALERT, viewController: self)
}
}
2) По второй причине:
Вы отключили подпрыгивание collectionView?
В раскадровке установите флажок «Отскок при прокрутке» collectionView, если он не установлен.

Для будущих читателей этого старого вопроса - возможно я в будущем;)
У меня был UITapGestureRecognizer, который проглатывал мои короткие нажатия (в дедушке UICollectionView) и, следовательно, проходили только старые нажатия! Я думаю, у вас такая же проблема. Вам просто нужно добавить tapRecognizer.cancelsTouchesInView = false!
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapDidTouch(sender:)))
tapRecognizer.cancelsTouchesInView = false
scrollView.addGestureRecognizer(tapRecognizer)
Какова ваша иерархия представлений? такое CollectionView внутри ScrollView? или другие Subviews, у которых есть собственное обнаружение