swift - xcode 9.0.1/swift 4,没有使用 Objective-C 选择器 'onClick:forEvent:' 声明的方法

标签 swift swift4

<分区>

我使用 swift 4 构建我的 UI,我创建了一个 UIButton 并想向它添加一个目标。

但是编译器抛出警告:No method declared with Objective-C selector 'onClick:forEvent:'

button.addTarget(self, action: Selector("onClick:forEvent:"), for: UIControlEvents.touchUpInside) 
//...

func onClick(_ sender: Any, forEvent event: UIEvent) {
  print("button click", sender, event);
}

当我点击警告三角形时尝试修复此问题。 将选择器名称括在括号中以抑制此警告

它只是将选择器名称括在括号中。

button.addTarget(self, action: Selector(("onClick:forEvent:")), for: UIControlEvents.touchUpInside)

构建成功,但是当我点击按钮时。

抛出一个错误

libc++abi.dylib:以 NSException 类型的未捕获异常终止

我知道它可以更改为 #selector(ViewClass.methodName)@objc func methodName() {..} 方式。

但为什么 Selector 不起作用?这是正确的 swift 4 方式吗?

最佳答案

您应该在函数前加上@objc 以使其对 Objective-C 运行时可见,例如:

@objc func onClick(_ sender: Any, forEvent event: UIEvent)

关于swift - xcode 9.0.1/swift 4,没有使用 Objective-C 选择器 'onClick:forEvent:' 声明的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46829032/

相关文章:

ios - MapKit View 未放大到用户位置

ios - (iOS + Firebase) 无法将图像从 UITableViewCell 传递到下一个 ViewController

swift - Xcode 7.3 - Swift - 预期声明 - Apple Watch 应用

ios - UiView 和所有 subview 的副本..无法按下复制的 UIButton

swift - 获取请求在 Swift 4.1 中不起作用

ios - 什么是Swift预处理器相当于iOS版本检查比较?

swift - 我的委托(delegate)函数没有在 Swift 中被调用

ios - 使用 Swift 4.2 编译的模块无法被 Swift 5.0.1 编译器导入

swift - MKPolyLine swift 4

Swift 4 URLComponents 不连接路径变量