获取按钮操作:UICollectionView Cell

Posted

技术标签:

【中文标题】获取按钮操作:UICollectionView Cell【英文标题】:Getting button action : UICollectionView Cell 【发布时间】:2012-12-07 06:03:09 【问题描述】:

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

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

如何获得按钮操作?

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

也适合我。但我想知道这是否会在内部破坏任何东西。 从 PSTCollectionView 迁移到 UICollectionView 出现了这个问题。 @haider:非常感谢您提供这个答案。我以同样的方式组织了我的故事板和笔尖,并遇到了同样的麻烦。当默认情况下将 UIView 插入新 nib 时,很容易忽略这样的事情。非常感谢您的回答。 如果按钮是 UIView 上的子视图,情况也是如此!确保按钮位于顶层! 太棒了!我不想再次应用我的所有约束,所以我摆弄了 xib 文件并将其转换为 UICollectionViewCell 而不会丢失我的约束。【参考方案2】:

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

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

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

【讨论】:

我不知道以前的版本,但是在 Xcode 5.1.1 中,创建一个以 UICollectionViewCell 作为根视图元素的 nib,将导致将添加到该根视图的任何内容添加到 contentView加载后的最后一个单元格。因此,这个答案的一部分,其中指出笔尖的内容将被添加到 UICollectionViewCell 而不是它的 contentView,是不正确的(至少对于 Xcode 5.1.1)。 有没有办法通过使用这个解决方案以某种方式实现索引路径?【参考方案3】:

UICollectionViewCell Class Reference

要配置单元格的外观,请添加所需的视图 将数据项的内容作为子视图呈现给 内容视图属性。不要直接将子视图添加到单元格本身。 单元格管理多个内容层,其中内容视图 只有一个。除了内容视图,单元格还管理两个 背景视图显示单元格在其选定和 未选择的状态。

您可以像这样在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");

【讨论】:

我不能 100% 确定我们是否可以通过 nib 做到这一点。我试过但失败了。使用我的答案中的代码有效。 有没有办法通过使用这个解决方案以某种方式实现索引路径? 工作正常。添加按钮自定义视图而不是单元格内容视图。【参考方案4】:

我刚刚通过添加解决了它

[self bringSubviewToFront:myButton];

转入awakeFromNib

【讨论】:

它不起作用,但通过代码在 awakeFromNib 中添加目标选择器效果很好。【参考方案5】:

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

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

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

【讨论】:

我已经将“Autoresize subviews”设置为“是”,但您的回答告诉我,我的 contentView 确实没有正确调整大小,这是导致问题的原因。所以现在我需要弄清楚除了“Autoresize subviews”之外还有什么可能导致这个......编辑:这个答案为我解决了这个问题:@ 987654321@原来这是从Xcode 5切换到Xcode 6的错误的结果.【参考方案6】:

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

在 UICollectionViewCell 中有两种类型。

    集合视图单元格 集合可重用视图

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

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

【讨论】:

【参考方案7】:

在 UICollectionViewCell 中为 CollectionView 创建一个句柄

在 UICollectionViewCell 的 .h 文件中

@property (nonataomic, retain) UICollectionView *collView;

在 UICollectionViewCell 的 .m 文件中

@synthesize *collView;

然后在Controller的实现文件中的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];

【讨论】:

-collectionView:didSelectItemAtIndexPath: 与按钮按下混为一谈是个坏主意,更不用说让每个单元格都知道其父集合视图 您还在单元格和集合视图之间创建了一个强大的保留周期

以上是关于获取按钮操作:UICollectionView Cell的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 中的 UICollectionView 自定义按钮操作

在正确的时间获取 UICollectionview 的边界/框架

在 UICollectionView 中实现按钮点击

如何从选定的 UICollectionView 单元格中获取数据?

Objective C - 使用导航推送调用 UICollectionview

UICollectionView contentOffset 错误