UICollectionView委托的tap方法没有被调用

时间:2013-07-17 12:58:27

标签: iphone ios cocoa-touch uicollectionview

我有一个集合视图,数据源委托效果很好,但是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覆盖..

更新

WEIRD!如果我长按,它只会被调用!我怎么能解决这个问题,我将delayedContentTouches设置为NO加上我没有实现任何手势识别器。

请帮忙。感谢。

9 个答案:

答案 0 :(得分:37)

看起来在视图层次结构中某处有一个UITapGestureRecognizer。默认情况下,UITapGestureRecognizer消耗他们收到的触摸,这意味着它不会传递给层次结构中它下面的视图。您需要找到流氓点击手势并添加此行

tapGestureRecognizer.cancelsTouchesInView = NO;

这将使它在层次结构中传递给它下面的视图,并希望解决您的问题。

答案 1 :(得分:9)

看起来你已经在某处添加了TapGestureRecognizer,它会阻止选择单元格。检查一下,这应该是问题。

答案 2 :(得分:3)

我遇到了同样的问题,点击自定义UICollectionView Cell,它没有检测到点击。 在我的例子中,问题是在CustomCell的Xib中,启用了userInteraction,这就是UICollectionview的didSelectItemAtIndexPath未被调用的原因,而是用户点击信息被发送到我没有处理程序的特定单元格。

答案 3 :(得分:1)

我有一个与PSUICollectionView类似的问题(这也适用于iOS5)我通过在我的CollectionViewCell上放一个按钮并设置该按钮的目标来修复它 还要添加标签以了解按下了哪个按钮。

答案 4 :(得分:0)

在你的.h文件中,导入CellViewController并添加委托

#import "myColleCell.h"

UIViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>
在.m文件中

,将以下代码添加到您的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]; 

并使用您的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

答案 5 :(得分:0)

确保没有任何对象将userInteractionEnabled属性设置为NO上的UICollectionViewController

与其他人的说法类似,我遇到了同样的问题,并通过删除对userInteractionEnabled的调用来修复,其中父视图将其添加为子视图控制器。我能够通过向单元格添加UIButton并确定即使它无法接收触摸事件来测试这一点。

答案 6 :(得分:0)

在此处添加作为其他寻找答案的人的参考

简答:

延迟与tableview相关联的默认手势识别器的触摸:

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

<强>解释

每个tableview都有与之关联的手势识别器。这导致触摸延迟到自定义UItableView单元格。将 delaysTouchesBegan 设置为true,以便可以快速将触摸传递给子视图。

在我的情况下, UItableViewCell 中的 CollectionViewController ,其中 collectionView:didSelectItemAtIndexPath 被延迟调用。

答案 7 :(得分:0)

就我而言,我在 self.view 中添加了 TapRecognizer,因此屏幕中的所有点击都在 self.view 而不是 collectionViewDidSelect 中接收。

所以要注意这一点。

答案 8 :(得分:-2)

也许你应该在集合视图上使用点击手势。