无法识别的选择器发送到自定义 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 按钮中的实例的主要内容,如果未能解决你的问题,请参考以下文章
自定义表视图控制器因“initWithCoder:无法识别的选择器发送到实例”而崩溃