类型 'UIViewController' 不符合协议 'WCSessionDelegate'
Type 'UIViewController' does not conform to protocol 'WCSessionDelegate'
自从在 Xcode 8(Beta 1)和 Swift 3 上升级后,我在这一行中遇到错误:
class CloudViewController: UIViewController, WCSessionDelegate {
它说:
Type 'UIViewController' does not conform to protocol
'WCSessionDelegate'
这是我的(Xcode 7 和 Swift 2 有效)代码:
override func viewDidLoad() {
super.viewDidLoad()
if(WCSession.isSupported()){
self.session = WCSession.default()
self.session.delegate = self
self.session.activate()
}
}
func session(_ session: WCSession, didReceiveMessage message: [String : AnyObject]) {
print("didReceiveMessage")
watchMessageHandler.getMessage(message)
}
此错误也出现在 WKInterfaceController 类。
每个协议都带有一组方法,您应该实施这些方法以符合它们。您必须在 class 中编写这些方法以符合它。
例如,在一个UIViewController中,如果你决定有一个tableView,你必须添加UITableViewDataSource
、UITableViewDelegate
协议,像这样:
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate {
}
但是,这并不是协议的完整实现。这只是声明。
要让您的视图控制器真正符合协议,您必须实现两个方法,即:cellForRowAtIndexPath
和numberOfRowsInSection
。这是协议的要求。
所以,完整的实现看起来像这样:
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cellID", forIndexPath: indexPath) as! ExperienceCell
return cell
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return 0
}
}
因此,您必须查看文档并找到您的协议需要 class 实现哪些方法。
那应该可以解决这个问题。而且我不认为这是用 Xcode 8 或 swift 3
做任何事情
编辑 这里:这就是 apple documentation says
Most methods of this protocol are optional. You implement the methods you need to respond to the data transfer operations that your apps support. However, apps should implement support for the session:activationDidCompleteWithState:error: method to support asynchronous activation, and the delegate in your iPhone app should implement the sessionDidBecomeInactive: and sessionDidDeactivate: methods to support multiple Apple Watches.
在您的 CloudViewController 中添加此方法
internal func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: NSError?){
}
此错误表明您需要为 WCSessionDelegate 实施所需的协议方法
使用Swift3,你应该根据新协议实现这些方法
session:activationDidCompleteWithState:error:
sessionDidBecomeInactive:
sessionDidDeactivate:
因为它们在协议上不再标记为可选。
自从在 Xcode 8(Beta 1)和 Swift 3 上升级后,我在这一行中遇到错误:
class CloudViewController: UIViewController, WCSessionDelegate {
它说:
Type 'UIViewController' does not conform to protocol 'WCSessionDelegate'
这是我的(Xcode 7 和 Swift 2 有效)代码:
override func viewDidLoad() {
super.viewDidLoad()
if(WCSession.isSupported()){
self.session = WCSession.default()
self.session.delegate = self
self.session.activate()
}
}
func session(_ session: WCSession, didReceiveMessage message: [String : AnyObject]) {
print("didReceiveMessage")
watchMessageHandler.getMessage(message)
}
此错误也出现在 WKInterfaceController 类。
每个协议都带有一组方法,您应该实施这些方法以符合它们。您必须在 class 中编写这些方法以符合它。
例如,在一个UIViewController中,如果你决定有一个tableView,你必须添加UITableViewDataSource
、UITableViewDelegate
协议,像这样:
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate {
}
但是,这并不是协议的完整实现。这只是声明。
要让您的视图控制器真正符合协议,您必须实现两个方法,即:cellForRowAtIndexPath
和numberOfRowsInSection
。这是协议的要求。
所以,完整的实现看起来像这样:
class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cellID", forIndexPath: indexPath) as! ExperienceCell
return cell
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return 0
}
}
因此,您必须查看文档并找到您的协议需要 class 实现哪些方法。 那应该可以解决这个问题。而且我不认为这是用 Xcode 8 或 swift 3
做任何事情编辑 这里:这就是 apple documentation says
Most methods of this protocol are optional. You implement the methods you need to respond to the data transfer operations that your apps support. However, apps should implement support for the session:activationDidCompleteWithState:error: method to support asynchronous activation, and the delegate in your iPhone app should implement the sessionDidBecomeInactive: and sessionDidDeactivate: methods to support multiple Apple Watches.
在您的 CloudViewController 中添加此方法
internal func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: NSError?){
}
此错误表明您需要为 WCSessionDelegate 实施所需的协议方法
使用Swift3,你应该根据新协议实现这些方法
session:activationDidCompleteWithState:error:
sessionDidBecomeInactive:
sessionDidDeactivate:
因为它们在协议上不再标记为可选。