Swift - MultipeerConnectivity类型不符合协议

时间:2015-06-30 09:08:29

标签: ios swift protocols multipeer-connectivity

我正在尝试this tutorial并且遇到代码问题:

class MPCManager: NSObject, MCSessionDelegate, MCNearbyServiceBrowserDelegate, MCNearbyServiceAdvertiserDelegate {

我收到了一个错误:

  

类型'MPCManager'不符合协议'MCSessionDelegate'

     

类型'MPCManager'不符合协议'MCNearbyServiceBrowserDelegate'

     

类型'MPCManager'不符合协议'MCNearbyServiceAdvertiserDelegate'

但我下载的示例文件没有得到相同的错误。我错过了哪一部分?

3 个答案:

答案 0 :(得分:4)

如果您想要符合这些协议,则需要实现MCSessionDelegateMCNearbyServiceBrowserDelegate以及MCNearbyServiceAdvertiserDelegate所需的所有委托方法。

答案 1 :(得分:3)

您必须添加该协议所需的所有委托方法。

我已将所有必需的方法添加到以下代码中:

import Foundation
import MultipeerConnectivity


class MPCManager: NSObject, MCSessionDelegate, MCNearbyServiceBrowserDelegate, MCNearbyServiceAdvertiserDelegate {

    //Type 'MPCManager' does not comform to protocol 'MCSessionDelegate'
    // Remote peer changed state
    func session(session: MCSession!, peer peerID: MCPeerID!, didChangeState state: MCSessionState){

    }

    // Received data from remote peer
    func session(session: MCSession!, didReceiveData data: NSData!, fromPeer peerID: MCPeerID!){

    }

    // Received a byte stream from remote peer
    func session(session: MCSession!, didReceiveStream stream: NSInputStream!, withName streamName: String!, fromPeer peerID: MCPeerID!){

    }

    // Start receiving a resource from remote peer
    func session(session: MCSession!, didStartReceivingResourceWithName resourceName: String!, fromPeer peerID: MCPeerID!, withProgress progress: NSProgress!){

    }

    // Finished receiving a resource from remote peer and saved the content in a temporary location - the app is responsible for moving the file to a permanent location within its sandbox
    func session(session: MCSession!, didFinishReceivingResourceWithName resourceName: String!, fromPeer peerID: MCPeerID!, atURL localURL: NSURL!, withError error: NSError!){

    }


    //Type 'MPCManager' does not comform to protocol 'MCNearbyServiceBrowserDelegate'

    // Found a nearby advertising peer
    func browser(browser: MCNearbyServiceBrowser!, foundPeer peerID: MCPeerID!, withDiscoveryInfo info: [NSObject : AnyObject]!){

    }

    // A nearby peer has stopped advertising
    func browser(browser: MCNearbyServiceBrowser!, lostPeer peerID: MCPeerID!){

    }

    //Type 'MPCManager' does not comform to protocol 'MCNearbyServiceAdvertiserDelegate'
    // Incoming invitation request.  Call the invitationHandler block with YES and a valid session to connect the inviting peer to the session.
    func advertiser(advertiser: MCNearbyServiceAdvertiser!, didReceiveInvitationFromPeer peerID: MCPeerID!, withContext context: NSData!, invitationHandler: ((Bool, MCSession!) -> Void)!){

    }

}

如果您要检查哪些具体委托要求的方法,然后就命令+点击该委托,你会发现所有与委托相关的方法,如果你命令+点击想MCSessionDelegate,那么你将看到这样的事情:

// Delegate methods for MCSession
protocol MCSessionDelegate : NSObjectProtocol {

    // Remote peer changed state
    func session(session: MCSession!, peer peerID: MCPeerID!, didChangeState state: MCSessionState)

    // Received data from remote peer
    func session(session: MCSession!, didReceiveData data: NSData!, fromPeer peerID: MCPeerID!)

    // Received a byte stream from remote peer
    func session(session: MCSession!, didReceiveStream stream: NSInputStream!, withName streamName: String!, fromPeer peerID: MCPeerID!)

    // Start receiving a resource from remote peer
    func session(session: MCSession!, didStartReceivingResourceWithName resourceName: String!, fromPeer peerID: MCPeerID!, withProgress progress: NSProgress!)

    // Finished receiving a resource from remote peer and saved the content in a temporary location - the app is responsible for moving the file to a permanent location within its sandbox
    func session(session: MCSession!, didFinishReceivingResourceWithName resourceName: String!, fromPeer peerID: MCPeerID!, atURL localURL: NSURL!, withError error: NSError!)

    // Made first contact with peer and have identity information about the remote peer (certificate may be nil)
    optional func session(session: MCSession!, didReceiveCertificate certificate: [AnyObject]!, fromPeer peerID: MCPeerID!, certificateHandler: ((Bool) -> Void)!)
}

只有最后一个方法是可选的,所以如果你不添加它,你的委托就可以了,但是你必须在你的类中添加所有5个以上的方法以符合协议。

希望它会有所帮助。

答案 2 :(得分:1)

您需要实现委托的协议。在xcode中键入函数时可以找到它。