2016-06-18 3 views
3

С обновлением на Xcode 8 (Beta 1) и Swift 3 У меня есть ошибка в этой строке:Тип 'UIViewController' не соответствует протоколу 'WCSessionDelegate'

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.

+0

Вы строили/чистили проект? –

+0

@AkshanshThakur да, несколько раз – Devhess

+0

Если вы читаете полную ошибку в выходе сборки, она сообщает вам, как вы не соответствуете протоколу –

ответ

6

Каждый протокол поставляется с набором методов, которые вы должны реализовать, чтобы соответствовать им. Вы должны написать эти методы в своем классе, чтобы соответствовать им.

Например, в UIViewController, если вы решили иметь Tableview, вы должны добавить UITableViewDataSource, UITableViewDelegate протокол, например, так:

class ViewController : UIViewController, UITableViewDataSource, UITableViewDelegate { 

} 

Но это не полная реализация протокола. Это просто декларация.

Чтобы на самом деле ваш контроллер View соответствовал протоколу, вам необходимо реализовать два метода: 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 
    } 

} 

Таким образом, вы должны смотреть в документацию и найти то, что методы делают ваш протокол требует класса для реализации. Это должно решить эту проблему. И я не думаю, что это сделать что-нибудь с Xcode 8 или стремительной 3

EDIT Здесь: Это то, что 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.

-1

Добавить это методы в вашем CloudViewController

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

Эта ошибка предполагает, что вам необходимо реализовать требуемый протокол для WCSessionDelegate

16

С Swift 3, you shoul d применяют этот метод в соответствии с новым протоколом

session:activationDidCompleteWithState:error:

sessionDidBecomeInactive:

sessionDidDeactivate:

потому что они больше не отмечены как дополнительные по протоколу.

+0

Best обновленный ответ для Swift 3/iOS10/XCode 8 – Josh

Смежные вопросы