23

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

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

我怎样才能获得按钮动作?

4

7 回答 7

91

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

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

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

在此处输入图像描述

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

于 2013-07-15T19:30:39.793 回答
11

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

正如 sunkehappy 所指出的,您想要接收触摸事件的任何内容都需要进入 contentView。它已经为您创建好了,所以您能做的最好的事情就是UIButton在 awakeFromNib 时间以编程方式将您的内容移到 contentView 中。

-(void)awakeFromNib {
    [self.contentView addSubview:self.myButton];
}
于 2013-05-31T22:25:55.237 回答
7

UICollectionViewCell 类参考

要配置单元格的外观,请将数据项内容显示为子视图所需的视图添加到 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");
}
于 2012-12-07T07:19:30.330 回答
2

我刚刚通过添加解决了它

[self bringSubviewToFront:myButton];

进入awakeFromNib

于 2015-10-08T14:37:46.023 回答
1

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

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

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

于 2014-02-07T20:53:30.353 回答
0

我觉得很难理解 Accepted 的答案,我会尽量给出一个简单的答案。

在 UICollectionViewCell 中有两种类型。

  1. 集合视图单元格
  2. 集合可重用视图

我使用了 Collection Reusable View,因为按钮操作不起作用。

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

在此处输入图像描述

于 2018-12-05T11:02:13.957 回答
-3

在 UICollectionViewCell 中为 CollectionView 创建一个句柄

在 UICollectionViewCell 的 .h 文件中

@property (nonataomic, retain) UICollectionView *collView;

在 UICollectionViewCell 的 .m 文件中

@synthesize *collView;

然后在Controller的实现File中的foll Method中设置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];
}
于 2013-03-08T05:04:59.323 回答