Swift 发送到实例的自定义 UIButton 无法识别的选择器
Swift Customized UIButton unrecognized selector sent to instance
正如标题所说,我收到了这条错误信息:
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[{Project}.{UIView} tapAction:]: unrecognized selector sent to instance 0x156406c70'
terminating with uncaught exception of type NSException
当我尝试像这样自定义 UIButton
时:
class BaseButton: UIButton {
private var action: ((UIButton)->())?
public func tapInside(target: Any?, action: ((UIButton)->())?) {
self.action = action
self.addTarget(target, action: #selector(tapAction(_:)), for: .touchUpInside)
}
@objc private func tapAction(_ sender: UIButton) {
if let _f = action {
_f(self)
}
}
}
我知道我在不了解基础知识的情况下尝试了一些高级的东西。
如果有任何其他解决方案,我不必每次都创建 tapAction
,请告诉我。
更新:
详细信息已添加到错误消息中。
如果您要分享完整的错误消息,您应该:
-[TheClass tapAction:] unrecognized selector sent to instance
其中 TheClass
应该是调用 tapInside(target:action:)
的实例的 class。
这可能会为您提供解决问题的提示。
也就是说,TheClass
正在调用自己的方法 tapAction(_:)
,这是不知道的。
就像写 theClass.tapAction(someSender)
,这不应该编译,对吧?
问题是,在 addTarget(_:action:for:)
中,target
是实现 action
(选择器)的那个。在本例中,它是 self
,BaseButton
实例。
所以:
self.addTarget(target, action: #selector(tapAction(_:)), for: .touchUpInside)
=>
self.addTarget(self, action: #selector(tapAction(_:)), for: .touchUpInside)
现在,由于您不再需要 target
参数,您可以将其从方法中删除:
public func tapInside(target: Any?, action: ((UIButton)->())?) {...}
=>
public func tapInside(action: ((UIButton)->())?) {...}
正如标题所说,我收到了这条错误信息:
libc++abi: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[{Project}.{UIView} tapAction:]: unrecognized selector sent to instance 0x156406c70'
terminating with uncaught exception of type NSException
当我尝试像这样自定义 UIButton
时:
class BaseButton: UIButton {
private var action: ((UIButton)->())?
public func tapInside(target: Any?, action: ((UIButton)->())?) {
self.action = action
self.addTarget(target, action: #selector(tapAction(_:)), for: .touchUpInside)
}
@objc private func tapAction(_ sender: UIButton) {
if let _f = action {
_f(self)
}
}
}
我知道我在不了解基础知识的情况下尝试了一些高级的东西。
如果有任何其他解决方案,我不必每次都创建 tapAction
,请告诉我。
更新: 详细信息已添加到错误消息中。
如果您要分享完整的错误消息,您应该:
-[TheClass tapAction:] unrecognized selector sent to instance
其中 TheClass
应该是调用 tapInside(target:action:)
的实例的 class。
这可能会为您提供解决问题的提示。
也就是说,TheClass
正在调用自己的方法 tapAction(_:)
,这是不知道的。
就像写 theClass.tapAction(someSender)
,这不应该编译,对吧?
问题是,在 addTarget(_:action:for:)
中,target
是实现 action
(选择器)的那个。在本例中,它是 self
,BaseButton
实例。
所以:
self.addTarget(target, action: #selector(tapAction(_:)), for: .touchUpInside)
=>
self.addTarget(self, action: #selector(tapAction(_:)), for: .touchUpInside)
现在,由于您不再需要 target
参数,您可以将其从方法中删除:
public func tapInside(target: Any?, action: ((UIButton)->())?) {...}
=>
public func tapInside(action: ((UIButton)->())?) {...}