問題:
MultipeerConnectivityで接続可能になったデバイスを自動的に接続し、接続完了したデバイスのdisplay.nameを自前のテーブルビューに表示させたいのですが、接続が完了していても表示されません。
処理の流れ:
MCNearbyServiceAdvertiser、MCNearbyServiceBrowser、MCSessionはDeviceManagerという1つのswiftファイルにまとめてデバイスの管理をするようにして、接続が完了した時にtableViewのファイルにpeerIDを渡してtableView.reloadData()を実行するようにしています。
tableViewのファイル
import UIKit import MultipeerConnectivity class TestViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ let deviceManager = DeviceManager() let tableView = UITableView() @IBOutlet weak var label: UILabel! var connectedDeviceArray: [String] = [] override func viewDidLoad() { super.viewDidLoad() deviceManager.delegate = self tableView.dataSource = self tableView.delegate = self } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "backTapped"{ connectedDeviceArray = [] } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = connectedDeviceArray[indexPath.row] cell.textLabel?.numberOfLines = 2 return cell } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete implementation, return the number of sections print("connectedDeviceArray.count = (self.connectedDeviceArray.count)") return connectedDeviceArray.count } func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { return "接続デバイス" } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { } } extension TestViewController: DeviceManagerDelegate{ func connectedDevices(manager : DeviceManager, peerID: MCPeerID){ OperationQueue.main.addOperation { self.connectedDeviceArray.append(peerID.displayName) print("connectedDeviceArray = (self.connectedDeviceArray)") //print文 self.tableView.reloadData() } } }
DeviceManagerファイル
import UIKit import MultipeerConnectivity protocol DeviceManagerDelegate{ func connectedDevices(manager: DeviceManager, peerID: MCPeerID) } class DeviceManager: NSObject { private let serviceType = "hogefuga" private let peerID = MCPeerID(displayName: UIDevice.current.name) private let serviceAdvertiser : MCNearbyServiceAdvertiser private let serviceBrowser : MCNearbyServiceBrowser var delegate : DeviceManagerDelegate? override init() { self.serviceAdvertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: nil, serviceType: serviceType) self.serviceBrowser = MCNearbyServiceBrowser(peer: peerID, serviceType: serviceType) super.init() self.serviceAdvertiser.delegate = self self.serviceAdvertiser.startAdvertisingPeer() self.serviceBrowser.delegate = self self.serviceBrowser.startBrowsingForPeers() } deinit { self.serviceAdvertiser.stopAdvertisingPeer() self.serviceBrowser.stopBrowsingForPeers() } lazy var session : MCSession = { let session = MCSession(peer: self.peerID, securityIdentity: nil, encryptionPreference: .required) session.delegate = self return session }() } extension DeviceManager: MCNearbyServiceAdvertiserDelegate{ func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) { print("%@", "didReceiveInvitationFromPeer (peerID)") invitationHandler(true, self.session) } func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didNotStartAdvertisingPeer error: Error) { } } extension DeviceManager: MCNearbyServiceBrowserDelegate{ func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) { browser.invitePeer(peerID, to: self.session, withContext: nil, timeout: 10) } func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) { print("%@", "didNotStartBrowsingForPeers: (error)") } func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) { print("(peerID.displayName)の接続が切れました。") } } extension DeviceManager: MCSessionDelegate{ func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) { switch state { case .notConnected: print("セッションが未接続状態になりました。DisplayName = (peerID.displayName)") case .connected: print("セッションは接続状態になりました。DisplayName = (peerID.displayName)") self.delegate?.connectedDevices(manager: self, peerID: peerID) default: print("セッションは接続中です。DisplayName = (peerID.displayName)") } } func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) { } func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) { } func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) { } func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) { } }
tableViewのファイルのprint文(//print文の部分)ではconnectedDeviceArrayの中がログに表示されるのですが、次のステップのself.tableView.reloadData()
でどうしてテーブルビューに表示されないのか、どうすれば表示されるのかを教えてもらえないでしょうか?
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー