我有一个集合视图,数据源委托运行良好,但是
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,而且我没有实现任何手势识别器。
请帮忙。谢谢。
看起来视图层次结构中的某个位置有一个
UITapGestureRecognizer
。默认情况下,UITapGestureRecognizer
会消耗它们接收到的触摸,这意味着它不会传递到层次结构中位于其下方的视图。您需要找到流氓点击手势并添加此行
tapGestureRecognizer.cancelsTouchesInView = NO;
这将使其将触摸传递到层次结构中位于其下方的视图,并有望解决您的问题。
看起来您已在某处添加了 TapGestureRecognizer,并且它阻止了单元格的选择。检查一下,这应该是问题所在。
我面临同样的问题,单击自定义 UICollectionView Cell,它没有检测到单击。 就我而言,问题是在 CustomCell 的 Xib 中启用了 userInteraction,这就是为什么 UICollectionview 的 didSelectItemAtIndexPath 没有被调用,而是用户点击信息被发送到我没有处理程序的特定单元格。
我在 PSUICollectionView 上也遇到了类似的问题(这也适用于 iOS5),我通过在 CollectionViewCell 上放置一个按钮并设置该按钮的目标来修复它 还添加标签以了解按下了哪个按钮。
就我而言,我在
self.view
中添加了TapRecognizer,因此屏幕中的所有点击都是在self.view
而不是在collectionViewDidSelect
中接收的。
所以要照顾好这个。
在 .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
确保没有任何对象将
userInteractionEnabled
上的 NO
属性设置为 UICollectionViewController
。
与其他人所说的类似,我也遇到了同样的问题,并且通过删除对
userInteractionEnabled
的调用来解决该问题,其中父视图将其添加为子视图控制器。我可以通过向单元格添加 UIButton
并确定即使它也无法接收触摸事件来测试这一点。
添加此处作为其他正在寻找答案的人的参考
简短回答:
延迟与桌面视图关联的默认手势识别器的触摸:
if let gestures = tableView.gestureRecognizers{
for gesture in gestures {
gesture.delaysTouchesBegan = true
}
}
解释
每个桌面视图都有与之关联的手势识别器。这会导致自定义 UItableView 单元格的触摸延迟。将 delaysTouchesBegan 设置为 true,以便触摸可以快速传递到子视图。
在我的例子中,它是 UItableViewCell 中的 CollectionViewController,其中 collectionView:didSelectItemAtIndexPath 被延迟调用。
我通过删除在根视图上设置的不需要的手势来修复此问题。我的代码库中某处有这一行:
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)))
不仅不需要这条线(因为当您在框架之外点击时键盘默认消失),它还阻止子视图获得它们应该获得的手势。
也许您应该在集合视图上使用点击手势。