【问题标题】:How to Update addTarget method to swift 4 [duplicate]如何将 addTarget 方法更新为 swift 4 [重复]
【发布时间】:2017-09-24 17:23:13
【问题描述】:

当将项目代码更新到 swift 4 时,add.target 方法出现一些错误 我该如何解决这个错误?

 //swift3

var chatLogController: ChatLogController? {
    didSet {
        sendButton.addTarget(chatLogController, action: #selector(ChatLogController.handleSend), for: .touchUpInside)

       uploadImageView.addGestureRecognizer(UITapGestureRecognizer(target: chatLogController, action: #selector(ChatLogController.handleUploadTap)))
    }
}

【问题讨论】:

  • "get some error" 得到 what 错误?
  • 此错误“'#selector' 的参数引用了未暴露给 Objective-C 的实例方法 'handleSend()'”
  • 嗯,这就是你的答案。只需阅读错误消息的内容即可!将@objc 放在您的func handleSend... 前面(看在上帝的份上,您甚至没有在问题中显示)。
  • 但是怎么做呢?我不在这行代码上使用 func
  • 不,你在声明时使用它。但是,正如我所说,你没有表现出来。找到你说func handleSend的地方,按照我说的去做。

标签: ios swift xcode selector swift4


【解决方案1】:

提示信息告诉你要做什么,在声明你的函数之前添加@obj

@objc func handleSend(_ sender: UIGestureRecognizer){
    ...
}

原因是因为:

在 Objective-C 中,选择器是一种引用对象名称的类型 Objective-C 方法。在 Swift 中,Objective-C 选择器由 Selector 结构,并且可以使用 #selector 构造 表达。为可以调用的方法创建选择器 Objective-C,传递方法名,如 #selector(MyViewController.tappedButton(_:))。要为属性的 Objective-C getter 或 setter 方法构造选择器,请将 以getter:setter: 标签为前缀的属性名称,例如 #selector(getter: MyViewController.myButton).

阅读更多here,在 Apples 文档中。

【讨论】:

  • 对于刚开始使用 Swift 编码的人来说,这是一个很好的答案。人们应该越来越少批评这样回答:)
  • @RoiMulia,谢谢。
  • @HabibAlejalil,哪个错误,你使用 Swift 4?
  • 但是当我使用 objc 时出现新错误:“objc 只能与类成员、@objc 协议和类的具体扩展一起使用”
  • @HabibAlejalil,你运行的是哪个 Swift 版本?
猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
相关资源
最近更新 更多