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

时间:2017-05-14 13:37:25

标签: ios swift uibutton

我正在使用带有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错误,我哪里出错?

感谢。

3 个答案:

答案 0 :(得分:1)

尝试在您的方法中添加@objc,在这种情况下并非严格要求,并删除classstatic限定符。

顺便说一句,从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")
}