4

自从在 Xcode 8(Beta 1)和 Swift 3 上升级以来,我在这一行出现了一个错误:

class CloudViewController: UIViewController, WCSessionDelegate {

它说 :

类型“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)

}

此错误也出现在 WKInterfaceController 类中。

4

3 回答 3

16

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

会话:activationDidCompleteWithState:错误:

sessionDidBecomeInactive:

sessionDidDeactivate:

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

于 2016-09-16T15:38:57.143 回答
8

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

例如,在 UIViewController 中,如果您决定使用 tableView,则必须添加UITableViewDataSource,UITableViewDelegate协议,如下所示:

class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate  {

}

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

要真正让您的 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
     }

}

因此,您必须查看文档并找到您的协议需要类实现哪些方法。那应该可以解决这个问题。而且我认为这与 Xcode 8 或 swift 3 无关

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

该协议的大多数方法都是可选的。您实现响应您的应用程序支持的数据传输操作所需的方法。但是,应用程序应该实现对 session:activationDidCompleteWithState:error: 方法的支持以支持异步激活,并且 iPhone 应用程序中的委托应该实现 sessionDidBecomeInactive: 和 sessionDidDeactivate: 方法以支持多个 Apple Watch。

于 2016-06-18T10:22:54.790 回答
-1

在您的 CloudViewController 中添加此方法

internal func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: NSError?){
}

此错误提示您需要为 WCSessionDelegate 实现所需的协议方法

于 2016-07-29T05:45:00.207 回答