我正在使用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)
}
}
答案 0 :(得分:5)
尝试将NSObject继承到您的班级。
class YourClass {
...
}
到
class YourClass: NSObject {
...
}
答案 1 :(得分:2)
您不能将实际参数包含在选择器中。
行动目标的方法只能采用三种形式:
清单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
//...
}