UICollectionView 委托的点击方法没有被调用

问题描述 投票:0回答:10

我有一个集合视图,数据源委托运行良好,但是

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
覆盖..

更新

奇怪!只有当我长按时它才会被调用!我该如何解决这个问题,我将delaysContentTouches设置为NO,而且我没有实现任何手势识别器。

请帮忙。谢谢。

iphone ios cocoa-touch uicollectionview
10个回答
48
投票

看起来视图层次结构中的某个位置有一个

UITapGestureRecognizer
。默认情况下,
UITapGestureRecognizer
会消耗它们接收到的触摸,这意味着它不会传递到层次结构中位于其下方的视图。您需要找到流氓点击手势并添加此行

tapGestureRecognizer.cancelsTouchesInView = NO;

这将使其将触摸传递到层次结构中位于其下方的视图,并有望解决您的问题。


9
投票

看起来您已在某处添加了 TapGestureRecognizer,并且它阻止了单元格的选择。检查一下,这应该是问题所在。


4
投票

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


1
投票

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


1
投票

就我而言,我在

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

所以要照顾好这个。


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]; 

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


0
投票

确保没有任何对象将

userInteractionEnabled
上的
NO
属性设置为
UICollectionViewController

与其他人所说的类似,我也遇到了同样的问题,并且通过删除对

userInteractionEnabled
的调用来解决该问题,其中父视图将其添加为子视图控制器。我可以通过向单元格添加
UIButton
并确定即使它也无法接收触摸事件来测试这一点。


0
投票

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

简短回答:

延迟与桌面视图关联的默认手势识别器的触摸:

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

解释

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

在我的例子中,它是 UItableViewCell 中的 CollectionViewController,其中 collectionView:didSelectItemAtIndexPath 被延迟调用。


0
投票

我通过删除在根视图上设置的不需要的手势来修复此问题。我的代码库中某处有这一行:

view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)))

不仅不需要这条线(因为当您在框架之外点击时键盘默认消失),它还阻止子视图获得它们应该获得的手势。


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.