【问题标题】:UICollectionView delegate's tap method not getting calledUICollectionView 委托的点击方法没有被调用
【发布时间】:2013-07-16 01:03:57
【问题描述】:

我有一个集合视图,数据源委托运行良好,但是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 加上我没有实现任何手势识别器。

请帮忙。谢谢。

【问题讨论】:

  • 你是如何定义 self.collectionView 的?带插座的故事板?在设置委托时检查它是否不为零。
  • 运气好能解决这个问题吗?我今天刚遇到同样的情况。长按似乎也触发了委托。
  • 这里有同样的问题。长按会选择。并且同一个项目中的另一个集合视图工作正常。
  • @henTdev 你能用适当的词更新问题的标题吗?
  • 同样的问题,这是 IOS 10 的错误吗?

标签: iphone ios cocoa-touch uicollectionview


【解决方案1】:

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

tapGestureRecognizer.cancelsTouchesInView = NO;

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

【讨论】:

  • 这应该被标记为正确答案!我花了一个小时才找到这个。 thnx @aksh1t
  • 旧但仍然是最佳答案! +1!!
  • 嗨,这有可能通过 viewControllers 传递吗?因为我有一些很难点击的单元格,即使它的大小还不错。每次点击时都不会调用该函数。
  • 视图控制器本身不是响应者链的一部分,它们的视图是。根据您的应用程序的设置方式,必须有一些东西(通常是点击手势识别器)消耗您认为适用于单元格的点击。您将需要找到正在执行此操作的查看/点击手势,并尝试将其删除或不取消触摸。
【解决方案2】:

看起来您在某处添加了 TapGestureRecognizer,它会阻止选择单元格。检查他们,这应该是问题。

【讨论】:

  • 这是我的问题。你能解释一下为什么 GestureRecognizer 会抑制短按,但允许长按吗?
  • 工作对我来说就像一个魅力。
【解决方案3】:

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

【讨论】:

  • 谢谢!在相同的情况下对我有用(从 xib 加载的单元格)。
【解决方案4】:

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

【讨论】:

  • 这就是我现在所做的,但它不是自然的解决方案
  • 我知道,但有时你只是想继续前进。如果可行,为什么不呢?
【解决方案5】:

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

所以请注意这个。

【讨论】:

    【解决方案6】:

    在你的 .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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        【解决方案8】:

        在此添加以供其他正在寻找答案的人参考

        简答:

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

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

        说明

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

        在我的例子中,UItableViewCell 中的 CollectionViewController 被延迟调用了 collectionView:didSelectItemAtIndexPath

        【讨论】:

          【解决方案9】:

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

          【讨论】:

          • 不,感觉就像是黑客攻击。
          • 奇怪!如果我长按它只会被调用!我该如何解决这个问题,我将 delaysContentTouches 设置为 NO 加上我没有实现任何手势识别器。 tnx 为您的 cmets。
          • @henTdev 这很奇怪!您应该在真实设备上试用它,看看它是否在那里正常工作。
          • 完全一样。这是最奇怪的。
          • @henTdev 我认为最好使用点击手势。我遇到了同样的问题,我使用了点击手势。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-03
          • 2020-11-28
          • 2017-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多