Swift 4中为自定义按钮添加addTarget遇selector报错求解决思路
Swift 4 自定义按钮 addTarget Selector 报错的解决办法
嘿,我之前也踩过这个坑!Swift 4 里的 Selector 语法对 Objective-C 运行时的依赖细节有不少变化,尤其是自定义按钮场景下,咱们一步步排查解决:
最常见的问题:忘记标记方法为 @objc
因为 addTarget 依赖 Objective-C 的 Runtime 机制,Swift 4 开始默认不会把所有 Swift 方法暴露给 OC,所以你的点击处理方法必须加上 @objc 标记:
// 正确写法 @objc func customButtonTapped(_ sender: UIButton) { // 你的点击逻辑 }
如果是在自定义按钮类内部写的方法,还要确保你的自定义按钮类继承自 UIButton(它本身是 NSObject 子类,满足 OC Runtime 要求)。
检查 Selector 签名是否完全匹配
Selector 必须和方法的签名严格对应,包括参数的下划线和冒号:
- 如果方法带参数(比如接收
sender),Selector 要写成#selector(customButtonTapped(_:))(注意下划线和冒号不能少) - 如果是无参数方法,Selector 是
#selector(customButtonTapped),对应方法是@objc func customButtonTapped()
举个自定义按钮内部绑定的完整例子:
class CustomActionButton: UIButton { override init(frame: CGRect) { super.init(frame: frame) setupButton() } required init?(coder: NSCoder) { super.init(coder: coder) setupButton() } private func setupButton() { // 设置按钮样式(背景色、字体等) self.backgroundColor = .systemBlue self.setTitle("点击我", for: .normal) // 绑定点击事件 addTarget(self, action: #selector(buttonDidTap(_:)), for: .touchUpInside) } @objc private func buttonDidTap(_ sender: UIButton) { print("自定义按钮被点击了!") } }
确认 addTarget 的调用时机
要保证在按钮初始化完成后再调用 addTarget,比如在自定义按钮的 init(frame:)、awakeFromNib() 方法里,或者在 ViewController 的 viewDidLoad() 中(当你从外部给自定义按钮绑定事件时)。
避免拼写或方法名冲突
仔细检查 Selector 里的方法名和实际方法名是否完全一致,大小写、下划线都不能出错。比如方法叫 customBtnTapped,Selector 写成 #selector(customButtonTapped) 肯定会报错。
如果按照上面的步骤还是有问题,可以把具体的错误信息贴出来,我再帮你针对性排查!
内容的提问来源于stack exchange,提问作者Sonya Kovach
相关产品推荐
相关产品推荐

