类型'UIViewController'不符合协议'WCSessionDelegate'

Dev*_*ess 4 ios swift watchkit watchconnectivity watchos-3

自从在Xcode 8(Beta 1)和Swift 3上升级后,我在此行中出错:

class CloudViewController: UIViewController, WCSessionDelegate {
Run Code Online (Sandbox Code Playgroud)

它说 :

类型'UIViewController'不符合协议'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)

}
Run Code Online (Sandbox Code Playgroud)

此错误也会显示在WKInterfaceController类中.

Dx_*_*Dx_ 16

使用Swift 3,您应该根据新协议实现此方法

会议:activationDidCompleteWithState:错误:

sessionDidBecomeInactive:

sessionDidDeactivate:

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


Aks*_*kur 8

每个协议都带有一组您应该实现的方法,以便符合它们.您必须在类中编写这些方法以符合它.

例如,在一个UIViewController,如果你决定要拥有的tableView,你必须添加UITableViewDataSource,UITableViewDelegate协议,就像这样:

class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate  {

}
Run Code Online (Sandbox Code Playgroud)

但是,这不是协议的完整实现.这仅仅是宣言.

要让View Controller符合协议,您必须实现两种方法,即: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
     }

}
Run Code Online (Sandbox Code Playgroud)

因此,您必须查看文档并找到协议要求类实现的方法.那应该可以解决这个问题.我认为不要对Xcode 8或swift 3做任何事情

编辑 :这是苹果文档所说的

该协议的大多数方法都是可选的.您可以实施响应应用程序支持的数据传输操作所需的方法.然而,应用程序应该实现支持会话:activationDidCompleteWithState:错误:方法来支持异步激活,并在您的iPhone应用程序委托应该实现sessionDidBecomeInactive:和sessionDidDeactivate:方法来支持多种苹果手表.