CollectionView: didSelectItemAtIndexPath вызывается с задержкой

У меня есть представление коллекции, которое загружает список продуктов, и в нем нет никаких необычных функций. Он просто загружает данные из 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)
        }
}

Просмотр иерархии выглядит следующим образом

CollectionView: didSelectItemAtIndexPath вызывается с задержкой

Заранее спасибо...!!!

Какова ваша иерархия представлений? такое CollectionView внутри ScrollView? или другие Subviews, у которых есть собственное обнаружение

iOS Geek 11.04.2018 07:33

Лучше использовать отладку представления и проверить, есть ли какое-либо представление поверх contententView collectionviewCell. Убедитесь, что вы перезагружаете collectionView на mainThread

Pandey_Laxman 11.04.2018 07:41

@iOSGeek Добавлен экран иерархии представлений, о котором идет речь

Jobins John 11.04.2018 08:05

@Pandey_Laxman Didselect функция делегата вызывается, когда я нажимаю ячейку на 3/4 секунды ...

Jobins John 11.04.2018 08:05

Вы применили «TapGesture» в главном окне или в просмотре коллекции?

iGatiTech 11.04.2018 08:06

@Gati В представлении или представлении коллекции нет распознавателей жестов

Jobins John 11.04.2018 08:12

@JobinsJohn захватывает рабочий экран на симуляторе или устройстве в режиме отладки, а затем проверьте.

Pandey_Laxman 11.04.2018 08:26

пройдите пожалуйста по этой ссылке stackoverflow.com/questions/17700437/…

Pandey_Laxman 11.04.2018 11:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
843
4

Ответы 4

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

Screenshot

Прежде всего, установите точку останова в условии 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

Jobins John 11.04.2018 11:02

Причин может быть две:

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, если он не установлен.

check this one!

Для будущих читателей этого старого вопроса - возможно я в будущем;)

У меня был UITapGestureRecognizer, который проглатывал мои короткие нажатия (в дедушке UICollectionView) и, следовательно, проходили только старые нажатия! Я думаю, у вас такая же проблема. Вам просто нужно добавить tapRecognizer.cancelsTouchesInView = false!

let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapDidTouch(sender:)))
tapRecognizer.cancelsTouchesInView = false
scrollView.addGestureRecognizer(tapRecognizer)

Другие вопросы по теме