类型 '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,你必须添加UITableViewDataSourceUITableViewDelegate协议,像这样:

class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate  {

}

但是,这并不是协议的完整实现。这只是声明。

要让您的视图控制器真正符合协议,您必须实现两个方法,即:cellForRowAtIndexPathnumberOfRowsInSection。这是协议的要求。

所以,完整的实现看起来像这样:

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:

因为它们在协议上不再标记为可选。