Swift4 - UIButton 在 UIView 中使用 addTarget 时出错

Posted

技术标签:

【中文标题】Swift4 - UIButton 在 UIView 中使用 addTarget 时出错【英文标题】:Swift4 - UIButton use addTarget in UIView with error 【发布时间】:2019-01-19 09:09:02 【问题描述】:

这是 UIVIew 中 required init 中带有 addTarget 的代码

required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    hiddenButton = self.viewWithTag(9000) as? UIButton
    hiddenButton.addTarget(self, action: "hiddenCameraAction:", for: .touchUpInside)

这是我的选择功能

func hiddenCameraAction(_ sender: Any)  
    //Do something

当我单击 UIView 中的按钮时,应用程序崩溃并出现错误:

TeachSystem[27065:8131674] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[TeachSystem.CameraView hiddenCameraAction:]:无法识别的选择器发送到实例 0x121d11050” * 首先抛出调用栈: (0x1ee830ec4 0x1eda01a40 0x1ee749c24 0x21bb74558 0x1ee8367dc 0x1ee83848c 0x21bb48454 0x21b5d5d0c 0x21b5d602c 0x21b5d502c 0x21bb81bac 0x21bb82e10 0x21bb6210c 0x21bc30f68 0x21bc33960 0x21bc2c450 0x1ee7c11f0 0x1ee7c1170 0x1ee7c0a54 0x1ee7bb920 0x1ee7bb1f0 0x1f0a34584 0x21bb46d40 0x105039f40 0x1ee27abb4) libc++abi.dylib:以 NSException 类型的未捕获异常终止

问题:如何解决这个错误?

【问题讨论】:

【参考方案1】:

action 应该定义为#selector:

hiddenButton.addTarget(self, action: #selector(hiddenCameraAction(_:)), for: .touchUpInside). 

【讨论】:

***: "别忘了你可以通过点击它的复选标记将它标记为已接受的答案。",最好标记你已接受的答案【参考方案2】:

您需要做的就是将字符串放入括号中。

action: ("hiddenCameraAction:")

...但是,这是已弃用的方式来实现您需要实现的目标。


我建议您开始使用更安全的选择器,因为编译器会立即为您提供错误,并且代码不会以错误的方法名称或其他方式运行。

语法是:#selector(method(externalParameter:))


...你可以开始输入,编译器会建议你在里面放什么 Objective-C 方法

action: #selector(hiddenCameraAction(_:))

【讨论】:

【参考方案3】:

动作应该定义为#selector,函数应该有一个@objc 推理。

hiddenButton.addTarget(self, action: #selector(hiddenCameraAction(_:)), for: .touchUpInside)

hiddenCameraAction功能

@objc func hiddenCameraAction(_ sender: Any)  
    //Do something

@objc 推断允许 Objective-C 运行时访问 hiddenCameraAction 方法。

【讨论】:

以上是关于Swift4 - UIButton 在 UIView 中使用 addTarget 时出错的主要内容,如果未能解决你的问题,请参考以下文章

uitableviewcell 中带有 swift4 部分的 uibutton 的动态数量

在swift4中制作循环按钮

UIImageView 中的 Swift 4 UIButton 操作不起作用

为啥 UITableViewCell 上的 UIButton 仅在触摸手势持续很短时间时才会变暗

如何实现UIButton的小型Dropdown,例如在Swift 4和iOS 11中选择货币?

在swift4中查找按钮的文本颜色