无法识别的选择器发送到自定义 UICollectionView 按钮中的实例

Posted

技术标签:

【中文标题】无法识别的选择器发送到自定义 UICollectionView 按钮中的实例【英文标题】:Unrecognised selector sent to instance within custom UICollectionView button 【发布时间】:2016-12-27 15:20:51 【问题描述】:

我有一个自定义UICollectionViewCell,在单元格内有一个名为collectionViewButton 的按钮。

  func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCollectionViewCell


    cell.collectionViewButton.tag = indexPath.item
    cell.collectionViewButton.addTarget(self, action:#selector(CollectionViewController.collectionButtonAction(_:)), for: .touchUpInside)

    ...


调用函数:

func collectionButtonAction(_ sender: UIButton)
    ...

按下按钮时的错误:

'[ProjectName.CustomCollectionViewCell collectionButtonAction:]: 出现发送到实例的无法识别的选择器。

CustomCollectionViewCell代码:

class CustomCollectionViewCell: UICollectionViewCell 

@IBOutlet weak var collectionViewButton: UIButton!


【问题讨论】:

我经常使用的一种模式(它可以让您轻松地将按钮按下与单元格和关联的数据相关联)是在单元格内部声明一个闭包,例如var onButtonPress: ((Void) -> Void)?。然后,在单元类中,我将添加collectionButtonAction 函数(并将其添加为按钮的目标操作)并在其中调用onButtonPress。最后,在cellForItemAt 中,我只需将闭包分配给cell.onButtonPress,然后在按下按钮时执行我想做的任何事情。 完整和准确的错误信息是什么?您遗漏了消息的所有导入部分。 我现在编辑帖子 实现集合视图数据源的类的名称是什么?该名称可能不是您在#selector(CollectionViewController.collectionButtonAction(_:)) 中使用的CollectionViewController。尝试仅使用 #selector(collectionButtonAction:) 。 See this answer 更改代码会引发同样的错误 【参考方案1】:

在单元格初始化方法中为您的collectionViewButton 添加一个目标并在属性中调用闭包,例如:

class CustomCollectionViewCell: UICollectionViewCell 

    @IBOutlet weak var collectionViewButton: UIButton!
    var actionHandler: (() -> Void)?

    init() 
        super.init(frame: .zero)
        collectionViewButton.addTarget(self, action:#selector(buttonAction), for: .touchUpInside)
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    func buttonAction() 
        actionHandler?()
    

在集合视图委托的cellForItemAt 方法中设置所需的处理程序。

【讨论】:

【参考方案2】:

更改下面的行

cell.collectionViewButton.addTarget(self, action:#selector(CollectionViewController.collectionButtonAction(_:)), for: .touchUpInside)

cell.collectionViewButton.addTarget(self, action:#selector(self.collectionButtonAction(_:)), for: .touchUpInside)

尝试一次。

【讨论】:

有些东西不见了。如果你有一些额外的代码显示一次。或完整的错误消息。

以上是关于无法识别的选择器发送到自定义 UICollectionView 按钮中的实例的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 init 方法上发送到实例的无法识别的选择器

无法识别的选择器发送到实例

自定义表视图控制器因“initWithCoder:无法识别的选择器发送到实例”而崩溃

UIButtonTypeDetailDisclosure : 无法识别的选择器发送到实例

如何解决“发送到实例的无法识别的选择器”?

Swift 3 NSCoder 无法识别的选择器发送到实例