获取按钮操作:UICollectionView Cell

时间:2012-12-07 06:03:09

标签: ios ipad uicollectionview uicollectionviewcell

我已经通过nib创建了一个UICollectionViewCell并在其中添加了一个按钮并创建了一个.h和.m文件,将该类添加到了nib file's owner。然后在.m中写了一个按钮动作通过插座连接。

集合视图填充正常,但无法触发按钮操作。 我认为收集单元的代表被调用。

我如何获得按钮操作?

7 个答案:

答案 0 :(得分:89)

我也有这个问题。没有子视图会收到触摸事件。虽然Scott K的解决方法确实有效,但我仍然觉得有些不对劲。所以我又看了一下我的笔尖,注意到我用来创建UICollectionViewCell的原始子视图是一个UIView。即使我将类更改为UICollectionViewCell的子类,XCode仍然认为它是UIView,因此您在contentView中看到的问题没有捕获触摸事件。

为了解决这个问题,我通过确保拖动UICollectionViewCell对象并将所有子视图移动到该对象来重新编写nib。之后,触摸事件开始对我的单元格的子视图起作用。

可以指示您的笔尖是否配置为UICollectionViewCell,请查看高级视图的图标。

enter image description here

如果它看起来不像这样,那么它可能会错误地解释触摸事件。

答案 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)

我有类似的问题,在单元格底部的子视图没有收到触摸事件,但顶部工作正常。所以我开始调查,得到了以下结果:

  • 界面构建器会将您在其中创建的单元格的任何子视图添加到单元格的contentView,即使在界面构建器中看不到contentView本身
  • 我的代码扩展了单元格以适应内容的大小,因此集合视图中的大多数单元格的高度都大于Interface Builder中的蓝图
  • 由于某种原因,单元格本身的“Autoresize subviews”属性设置为NO。这导致神秘且不可见的界面构建器contentView保持与最初在界面构建器中的单元格相同的大小,因此任何超出contentView范围的子视图都没有接收到触摸并且没有响应

将Interface Builder中单元格的“Autoresize子视图”设置为YES解决了我的问题!

答案 5 :(得分:0)

我很难理解已接受的答案,我将尝试给出一个简单的答案。

在UICollectionViewCell中有两种类型。

  1. 收藏夹视图单元格
  2. 可重复使用的视图

我使用了集合可重用视图,因为按钮操作不起作用。

然后按照接受的答案,我尝试使用“集合视图”单元格,因为只有“按钮动作”有效。使用图像中的第二个对象。它将正常工作。

enter image description here

答案 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];
}