我有一个集合视图,数据源委托效果很好,但是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加上我没有实现任何手势识别器。
请帮忙。感谢。答案 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)
也许你应该在集合视图上使用点击手势。