我正在使用带有UICollectionView的自定义单元格,我需要以编程方式为每个单元格定义UIButton。
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! ClinicListCell
cell.title.text = clinicNames[indexPath.row]
cell.subTitle.text = clinicSubs[indexPath.row]
cell.backgroundImageView.image = UIImage(named: clinicImages[indexPath.row])
cell.profileBtn.tag = indexPath.row
cell.profileBtn.addTarget(self, action: Selector(("profileBtnClicked:")), for: .touchUpInside)
return cell
}
我在同一个类中定义了以下选择器方法。
class func profileBtnClicked(sender:UIButton) {
print("Selected")
}
我尝试过从选择器方法中删除class / static,但它总是给我unrecognized selector sent to instance
错误,我哪里出错?
感谢。
答案 0 :(得分:1)
尝试在您的方法中添加@objc
,在这种情况下并非严格要求,并删除class
或static
限定符。
顺便说一句,从Swift 2.2开始,您可以使用Selector
运算符从Swift函数创建#selector
。例如:
let clicked = #selector(self.profileBtnClicked(sender:))
有:
@objc func profileBtnClicked(sender: UIButton) {
...
}
从技术上讲,对于基于NSObject
的类,@obj
限定符只应用于private
方法。
答案 1 :(得分:1)
profileBtn可能链接了吗?名称更改或删除界面构建器中的按钮与变量之间的链接时,可能会发生此错误。
或者您可以尝试使用语法
cell.profileBtn.addTarget(self, action: #selector("profileBtnClicked:"), for: .touchUpInside)
答案 2 :(得分:0)
Try this
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! ClinicListCell
cell.title.text = clinicNames[indexPath.row]
cell.subTitle.text = clinicSubs[indexPath.row]
cell.backgroundImageView.image = UIImage(named: clinicImages[indexPath.row])
cell.profileBtn.tag = indexPath.row
cell.profileBtn.addTarget(self, action: #selector(YourViewController.profileBtnClicked(sender:)), for: UIControlEvents.touchUpInside)
return cell
}
class func profileBtnClicked(sender:UIButton) {
print("Selected")
}