Swift 自定义 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,请告诉我。

更新: 详细信息已添加到错误消息中。

如果您要共享 FULL 错误消息,则应具有:

-[TheClass tapAction:] unrecognized selector sent to instance

其中TheClass应该是调用tapInside(target:action:)的实例的类。

这可能会给您一个关于您的问题的提示。

也就是说,TheClass调用自己的方法tapAction(_:),这是不知道的。 这就像写theClass.tapAction(someSender),这不应该编译吧?

问题是,在addTarget(_:action:for:)中,target是实现action(选择器)的那个。在本例中,它是selfBaseButton实例。

所以:

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)->())?) {...}

相关内容

最新更新