【问题标题】:#selector' refers to a method that is not exposed to Objective-C swift 3#selector'指的是没有暴露给Objective-C swift 3的方法
【发布时间】:2016-10-02 15:36:54
【问题描述】:

我正在使用 Xcode 8 和 swift 3。 我在“let action”行有以下错误: #selector' 指的是没有暴露给 Objective-C 的方法 有什么建议吗?

   override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cellWaze", for: indexPath) as! WazeTableViewCell

    // Configure the cell...
    cell.lbAgence.text = aWAgence[indexPath.row][0] as? String
    let cellLat :Double = aWAgence[indexPath.row][1] as! Double
    let cellLong :Double = aWAgence[indexPath.row][2] as! Double

    cell.bWaze.tag = indexPath.row
    let action = #selector(LaunchWaze(cellLat,longitude: cellLong))
    cell.bWaze.addTarget(self, action: action, for: .touchUpInside)

    return cell
}

@objc func LaunchWaze(_ latitude: Double, longitude: Double) {
    if UIApplication.shared.canOpenURL(NSURL(string: "waze://")! as URL) {
        // Waze is installed. Launch Waze and start navigation
        var urlStr = "waze://?ll=\(latitude),\(longitude)&navigate=yes"
        print("url : \(urlStr)")
        //UIApplication.shared.openURL(NSURL(string: urlStr)!)
    }
    else {
        // Waze is not installed. Launch AppStore to install Waze app
        UIApplication.shared.openURL(NSURL(string: "http://itunes.apple.com/us/app/id323229106")! as URL)
    }
}

【问题讨论】:

标签: selector swift3


【解决方案1】:

尝试将 NSObject 继承到你的类。

class YourClass {
  ...
}

class YourClass: NSObject {
  ...
}

【讨论】:

  • 这对我来说消除了添加 @objc 注释的要求。
  • 我是这么认为的,在swift中添加@objc并不漂亮。
【解决方案2】:

您不能在选择器中包含实际参数。

而action target的方法只能采取三种形式:

UIControl

清单 1 动作方法定义

    @IBAction func doSomething()
    @IBAction func doSomething(_ sender: UIButton)
    @IBAction func doSomething(_ sender: UIButton, forEvent event: UIEvent)

(我在sender之前添加了_,但这不是强制性的,只是你需要创建一个一致的选择器。UIButton可以是任何合适的UIControl子类,或者如果你不这样做就只是Any想想它应该是什么。@IBAction 可以替换为@objc 以编程方式添加方法时,在许多情况下,这是隐式添加的。)

所以,如果你想传递一些信息给action方法,你需要把它放在sender或者使用一些中间实例属性。


在您的情况下,快速修复将是这样的。

选择器应该是:

    let action = #selector(launchWaze(_:))

以及方法:

@objc func launchWaze(_ sender: UIControl) {
    let latitude: Double = aWAgence[sender.tag][1] as! Double
    let longitude: Double = aWAgence[sender.tag][2] as! Double

    //...        
}

【讨论】:

  • 感谢您的回答。真的很有帮助。
猜你喜欢
  • 2016-08-17
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多