我已经通过nib创建了一个UICollectionViewCell
并在其中添加了一个按钮并创建了一个.h和.m文件,将该类添加到了nib file's owner
。然后在.m中写了一个按钮动作通过插座连接。
集合视图填充正常,但无法触发按钮操作。 我认为收集单元的代表被调用。
我如何获得按钮操作?
答案 0 :(得分:89)
我也有这个问题。没有子视图会收到触摸事件。虽然Scott K的解决方法确实有效,但我仍然觉得有些不对劲。所以我又看了一下我的笔尖,注意到我用来创建UICollectionViewCell的原始子视图是一个UIView。即使我将类更改为UICollectionViewCell的子类,XCode仍然认为它是UIView,因此您在contentView中看到的问题没有捕获触摸事件。
为了解决这个问题,我通过确保拖动UICollectionViewCell对象并将所有子视图移动到该对象来重新编写nib。之后,触摸事件开始对我的单元格的子视图起作用。
可以指示您的笔尖是否配置为UICollectionViewCell,请查看高级视图的图标。
如果它看起来不像这样,那么它可能会错误地解释触摸事件。
答案 1 :(得分:11)
当您通过笔尖创建UICollectionViewCell
时,笔尖的内容不会添加到单元格的contentView中 - 它们都会直接添加到UICollectionViewCell
。似乎没有办法让Interface Builder将nib中的顶级视图识别为UICollectionViewCell
,因此“自动”内的所有内容都会添加到contentView中。
正如sunkehappy指出的那样,任何你想要接收触摸事件的东西都需要进入contentView。它已经为您创建,因此您可以做的最好的事情是在awakeFromNib时以编程方式将UIButton
移动到contentView中。
-(void)awakeFromNib {
[self.contentView addSubview:self.myButton];
}
答案 2 :(得分:6)
UICollectionViewCell Class Reference
要配置单元格的外观,请添加所需的视图 将数据项的内容显示为视图中的子视图 contentView属性。不要直接将子视图添加到单元格本身。 该单元管理多个内容层,其中包含内容视图 只有一个。除了内容视图,单元管理两个 显示所选单元格中的单元格的背景视图 未经选择的国家。
您可以在awakeFromNib
中添加按钮,如下所示:
- (void)awakeFromNib
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:button];
}
- (void)buttonClicked:(id)sender
{
NSLog(@"button clicked");
}
答案 3 :(得分:2)
我刚刚添加
解决了这个问题[self bringSubviewToFront:myButton];
进入awakeFromNib
答案 4 :(得分:1)
我有类似的问题,在单元格底部的子视图没有收到触摸事件,但顶部工作正常。所以我开始调查,得到了以下结果:
将Interface Builder中单元格的“Autoresize子视图”设置为YES解决了我的问题!
答案 5 :(得分:0)
我很难理解已接受的答案,我将尝试给出一个简单的答案。
在UICollectionViewCell中有两种类型。
我使用了集合可重用视图,因为按钮操作不起作用。
然后按照接受的答案,我尝试使用“集合视图”单元格,因为只有“按钮动作”有效。使用图像中的第二个对象。它将正常工作。
答案 6 :(得分:-3)
在UICollectionViewCell中为CollectionView创建句柄
在UICollectionViewCell的.h文件中
@property (nonataomic, retain) UICollectionView *collView;
在UICollectionViewCell的.m文件中
@synthesize *collView;
然后在foll方法的Controller实现File中设置Collection View
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
YourCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:homePageCollViewCellIdentifier forIndexPath:indexPath];
//NSString *str = [NSString stringWithFormat:@"HP item %d", indexPath.row+1];
cell.collView = self.theCollectionView;
}
现在正在实施你的UICollectionViewCell
- (void)awakeFromNib
{
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
[button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.contentView addSubview:button];
}
现在使用按钮点击方法
-(void)buttonClicked:(id)sender
{
NSLog(@"button clicked");
NSIndexPath *indPath = [collVw indexPathForCell:self];
[collVw.delegate collectionView:self.collVw didSelectItemAtIndexPath:indPath];
}