UICollectionView метод передачи делегата не вызван

У меня есть представление коллекции, делегат datasource работает хорошо, но UICollectionViewDelegate:

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didselect");
}

не вызывается, хотя я устанавливаю делегат (как я это делал с источником данных, и он работал) Я должен упомянуть, что моя ячейка загружена из наконечника и связана с подклассом UICollectionViewCell, так или иначе клетки не реагируют на мое прикосновение. Я включил взаимодействие пользователя в UIImageView, который находится в моей ячейке.

также:

-(BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"this is caled");
    return YES;
}

не вызывается!

как я уже говорил, я установил:

[self.collectionView setDelegate:self];

и, конечно,

<UICollectionViewDelegate>

также у меня нет переопределения touchBegan.

UPDATE

WEIRD! его только называют, если я долго буду настаивать! как я могу это исправить, я устанавливаю delaySontentTouches на NO plus, у меня нет никаких распознавателей жестов.

помогите пожалуйста. спасибо.

Ответы

Ответ 1

Похоже, что в иерархии представлений есть UITapGestureRecognizer. По умолчанию UITapGestureRecognizer потребляет прикосновение, которое они получают, что означает, что оно не передается в представления ниже под иерархией. Вам нужно найти жест из жулика и добавить эту строку

tapGestureRecognizer.cancelsTouchesInView = NO;

Это приведет к тому, что он перейдет к просмотрам под ним в иерархии и, надеюсь, решит вашу проблему.

Ответ 2

Похоже, вы добавили TapGestureRecognizer где-то, и он предотвращает selecton ячейки. Проверьте их, это должно быть проблемой.

Ответ 3

Я столкнулся с той же проблемой, что нажав на пользовательскую ячейку UICollectionView, он не обнаружил клик. В моем случае проблема заключалась в том, что в CustomCell Xib было включено действие userInteraction и почему UICollectionview didSelectItemAtIndexPath не вызывался, вместо этого пользовательская информация была отправлена ​​в эту конкретную ячейку, для которой у меня не было обработчика.

Ответ 4

У меня была аналогичная проблема с PSUICollectionView (это тоже работает на iOS5), и я исправил ее, поместив кнопку в свой CollectionViewCell и установив цель этой кнопки Также добавьте тег, чтобы узнать, какая кнопка нажата.

Ответ 5

Может быть, вы должны использовать жестов tap в представлении коллекции.

Ответ 6

в файле ur.h, импортируйте CellViewController и добавьте делегат

#import "myColleCell.h"

UIViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>

в ur.m файле, добавьте следующие коды к ur ViewDidLoad,

UINib *cellNib = [UINib nibWithNibName:@"myColleCell" bundle:nil];
[myCollectionView registerNib:cellNib forCellWithReuseIdentifier:@"myColleCell"];
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
[flowLayout setItemSize:CGSizeMake(220, 220)];
[flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[myCollectionView setCollectionViewLayout:flowLayout]; 

и установим ячейку с ur CellViewController

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
              cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier= @"myColleCell";
    myColleCell *cell = (myColleCell *)[collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    [cell setupCell:[dataArray objectAtIndex:indexPath.row]];
    //setup cell function methods placed in your CellViewController
    return cell;

}

и, наконец, убедитесь, что ваш cellView, collectionView настроен на взаимодействие с пользователем YES

Ответ 7

Убедитесь, что нет объектов, устанавливающих свойство userInteractionEnabled в NO на UICollectionViewController.

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

Ответ 8

Добавление здесь в качестве ссылки для других людей, которые ищут ответ

Короткий ответ:

Задержка касаний распознавателей жестов по умолчанию, связанных с табличным представлением:

    if let gestures = tableView.gestureRecognizers{
        for gesture in gestures {
            gesture.delaysTouchesBegan = true
        }
    }

Объяснение

В каждом представлении таблицы есть связанные с ним распознаватели жестов. Это приводит к задержкам касаний к пользовательской ячейке UItableView. Установите для параметра delayaysTouchesBegan значение true, чтобы прикосновение можно было быстро передать в subviews.

В моем случае это был CollectionViewController внутри UItableViewCell, для которого был вызван метод collectionView: didSelectItemAtIndexPath с задержкой.