Ios 获取按钮操作:UICollectionView单元格

Ios 获取按钮操作:UICollectionView单元格,ios,ipad,uicollectionview,uicollectionviewcell,Ios,Ipad,Uicollectionview,Uicollectionviewcell,我已经通过nib创建了一个UICollectionViewCell,并在其中添加了一个按钮,创建了一个.h和.m文件,将类添加到nib文件的所有者。然后在.m中编写了一个按钮操作,通过插座将其连接 集合视图正在填充,但无法触发buton操作。 我认为集合单元格的委托被调用 如何获得按钮操作? 要配置单元格的外观,请添加所需的视图 将数据项的内容作为子视图呈现给中的视图 contentView属性。不要直接将子视图添加到单元本身。 单元格管理多个内容层,其中的内容视图 只有一个。除内容视图外,单元

我已经通过nib创建了一个
UICollectionViewCell
,并在其中添加了一个按钮,创建了一个.h和.m文件,将类添加到nib
文件的所有者
。然后在.m中编写了一个按钮操作,通过插座将其连接

集合视图正在填充,但无法触发buton操作。 我认为集合单元格的委托被调用

如何获得按钮操作?

要配置单元格的外观,请添加所需的视图 将数据项的内容作为子视图呈现给中的视图 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");
}

在UICollectionViewCell中为CollectionView创建句柄

@property (nonataomic, retain) UICollectionView *collView;
@synthesize *collView;
- (void)awakeFromNib
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:button];
}
在UICollectionViewCell的.h文件中

@property (nonataomic, retain) UICollectionView *collView;
@synthesize *collView;
- (void)awakeFromNib
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:button];
}
在UICollectionViewCell的.m文件中

@property (nonataomic, retain) UICollectionView *collView;
@synthesize *collView;
- (void)awakeFromNib
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
    [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self.contentView addSubview:button];
}
然后在控制器的实现文件中的foll方法中设置Collection视图

-(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的实现中

@property (nonataomic, retain) UICollectionView *collView;
@synthesize *collView;
- (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];
}

通过nib创建
UICollectionViewCell
时,nib的内容不会添加到单元格的contentView中,而是直接添加到
UICollectionViewCell
。似乎没有办法让Interface Builder将nib中的顶级视图识别为
UICollectionViewCell
,因此“自动”将其中的所有内容添加到contentView

正如Sunkehapy所指出的,您想要接收触摸事件的任何内容都需要进入contentView。它已经为您创建好了,因此您最好在awakeFromNib时间以编程方式将您的
ui按钮
移动到contentView中

-(void)awakeFromNib {
    [self.contentView addSubview:self.myButton];
}

我也有这个问题。没有子视图将接收触摸事件。虽然Scott K的变通方法确实有效,但我仍然觉得有些地方出了问题。所以我又看了一眼我的笔尖,注意到我用来创建UICollectionViewCell的原始子视图是UIView。即使我将该类更改为UICollectionViewCell的子类,XCode仍然将其视为UIView,因此您会看到contentView无法捕获触摸事件的问题

为了解决这个问题,我通过确保拖动UICollectionViewCell对象并将所有子视图移动到该对象来重拨nib。之后,触摸事件开始在我手机的子视图上工作

可以查看nib是否配置为UICollectionViewCell的指示器查看高级视图的图标


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

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

  • 界面生成器会将您在其中创建的单元格的任何子视图添加到单元格的contentView中,即使contentView本身在界面生成器中不可见
  • 我的代码扩展了单元格以适应内容的大小,因此集合视图中的大多数单元格的高度都大于Interface Builder中的蓝图
  • 出于某种原因,单元格本身的“自动调整子视图大小”属性被设置为“否”。这导致interface builder contentView中的“神秘”和“不可见”与interface builder中的单元格原来的大小相同,因此,任何不在contentView范围内的子视图都不会收到接触,并且没有响应

将Interface Builder中单元格的“自动调整子视图大小”设置为“是”解决了我的问题

我刚刚通过添加

[self bringSubviewToFront:myButton];

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

在UICollectionViewCell中有两种类型

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

    然后根据已接受的答案,我尝试使用集合视图单元格,因为只有按钮操作起作用。使用图像中的第二个对象。它会很好用的


    我不能100%确定我们是否可以通过nib完成。我试过了,但失败了。在我的答案中使用代码是有效的。有没有办法通过使用这个解决方案以某种方式实现索引路径?效果很好。添加按钮自定义视图而不是单元格内容视图。对我也很有用。但我不知道这是否会在内部破坏任何东西。从PSTCollectionView迁移到UICollectionView时遇到了这个问题。@haider:非常感谢您提供这个答案。我以同样的方式组织了我的故事板和笔尖,经历了同样的麻烦。默认情况下,将UIView插入到新的nib时,很容易忽略类似的内容。非常感谢您的回答。如果按钮是UIView上的子视图,情况也是如此!确保按钮位于顶层!伟大的我不想再次应用所有约束,所以我摆弄了一下xib文件,并将其转换为
    UICollectionViewCell
    ,而不丢失约束。我不知道以前的版本,但在Xcode 5.1.1中,创建了一个nib,其中UICollectionViewCell作为根视图元素,将导致在加载后将添加到该根视图的任何内容添加到最终单元格的contentView。因此,这个答案中指出nib的内容将被添加到UICollectionViewCell而不是其contentView的部分是不正确的(至少对于Xcode 5.1.1而言)。是否有办法通过使用此解决方案以某种方式实现索引路径?我已经有了“自动调整子视图大小”