2017-03-23 25 views
0

現在、マルチペイパー接続を使用して画像を描画して送信できるテストアプリケーションを作成しています。ホストには接続ビューコントローラがあり、他のピアには別の接続ビューコントローラがあります。ピアが接続されると、ホストはゲームをプレイし、すべてのピアのビューコントローラは、それらが接続されていることを証明するVCに移動します。しかし、図面VCでデータを送信する場合、コンソールには、接続されているピアがありますが、接続されているピアはセッションが0であると表示されます。私はそれをテストすることができますので、私はコンソールで変更状態の通知を取得する切断。誰かが私のコードに間違っていることを教えてください。ありがとう。Swift 3 - View Controller間の変数と関数の受け渡し

ps私はiOS開発にかなり新しいので、私のコードに大きな問題があるかもしれません。

接続マネージャファイル:それは代わりにアドバタイズし、再生ボタンがあるときに、データを送信以外

import UIKit 

class browsingForPeers: UIViewController { 

    let connectionManager = ConnectionManager() 
    @IBOutlet weak var header: UITextField! 
    @IBOutlet weak var activityMonitor: UIActivityIndicatorView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     connectionManager.connectionDelegate = self 
     connectionManager.startBrowsing() 
//  Constants().host = false 
    } 

    func switchViewControllers(active: Bool) { 
     if active == true { 
      performSegue(withIdentifier: "browsingToDrawing", sender: self) 
     } 
    } 
} 

検索コントローラは、ブラウザと同じである

import UIKit 
import MultipeerConnectivity 

class ConnectionManager: NSObject { 

var localPeerId = MCPeerID(displayName: UIDevice.current.name) 
var service = "PI-Connect" 
var session: MCSession 
var browser: MCNearbyServiceBrowser 
var advertiser: MCAdvertiserAssistant 
var connectionDelegate: ConnectionManagerDelegate? 
var serviceDelegate: ServiceManagerDelegate? 
var gameStarted : Bool 

override init() { 

    self.session = MCSession(peer: self.localPeerId) 
    self.browser = MCNearbyServiceBrowser(peer: self.localPeerId, serviceType: service) 
    self.advertiser = MCAdvertiserAssistant(serviceType: service, discoveryInfo: nil, session: session) 
    gameStarted = false 

    super.init() 

    self.session.delegate = self 
    self.browser.delegate = self 
    self.advertiser.delegate = self 

} 

func startBrowsing() { 
    browser.startBrowsingForPeers() 
} 
func stopBrowsing() { 
    browser.stopBrowsingForPeers() 
} 
func startAdvertising() { 
    advertiser.start() 
} 
func stopAdvertising() { 
    advertiser.stop() 
} 

func startGame(gameStarted: String) { 
    NSLog("%@", "Start game: \(gameStarted) to \(session.connectedPeers.count) peers") 
    if session.connectedPeers.count > 0 { 
     do { 
      try session.send(gameStarted.data(using: .utf8)!, toPeers: session.connectedPeers, with: .reliable) 
     } 
     catch let error { 
      NSLog("%@", "Error for sending: \(error)") 
     } 
    } 
} 

func sendImage(imageData: Data) { 
    displayConnectedPeers() 
    NSLog("%@", "Attempting to send image to \(session.connectedPeers.count) peers") 
    if session.connectedPeers.count > 0 { 
     do { 
      try session.send(imageData, toPeers: session.connectedPeers, with: .reliable) 
      NSLog("%@", "Image sent") 
     } 
     catch let error { 
      NSLog("%@", "Error for sending image: \(error)") 
     } 
    } 
} 

func displayConnectedPeers() { 
    NSLog("%@", "Connected peers: \(session.connectedPeers.count)") 
} 
} 

extension ConnectionManager: MCNearbyServiceBrowserDelegate { 
func browser(_ browser: MCNearbyServiceBrowser, didNotStartBrowsingForPeers error: Error) { 
    NSLog("%@", "didNotStartBrowsingForPeers: \(error)") 
} 

func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) { 
    NSLog("%@", "foundPeer: \(peerID)") 
    NSLog("%@", "invitePeer: \(peerID)") 
    browser.invitePeer(peerID, to: session, withContext: nil, timeout: 10) 
    } 

func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) { 
    NSLog("%@", "lostPeer: \(peerID)") 
    self.connectionDelegate?.foundHost(manager: self) 
} 
} 

extension ConnectionManager: MCAdvertiserAssistantDelegate { 
func advertiserAssistantDidDismissInvitation(_ advertiserAssistant: MCAdvertiserAssistant) { 
    NSLog("%@", "Peer dismissed connection") 
} 

func advertiserAssistantWillPresentInvitation(_ advertiserAssistant: MCAdvertiserAssistant) { 
    NSLog("%@", "Peer accepted connection") 
} 
} 

extension ConnectionManager: MCSessionDelegate { 
func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) { 
    NSLog("%@", "peer \(peerID) didChangeState: \(state)") 
    self.connectionDelegate?.foundHost(manager: self) 
} 

func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) { 

    NSLog("%@", "didReceiveData: \(data)") 

    if gameStarted == false { 
     stopBrowsing() 
     self.connectionDelegate?.hostInitsGame(manager: self) 
     NSLog("%@", "Game Started") 
     gameStarted = true 
    } 

    if gameStarted == true { 
     self.serviceDelegate?.changeImage(manager: self, imageData: data) 
    } 
} 

func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) { 
    NSLog("%@", "didReceiveStream") 
} 

func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) { 
    NSLog("%@", "didStartReceivingResourceWithName") 
} 

func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL, withError error: Error?) { 
    NSLog("%@", "didFinishReceivingResourceWithName") 
} 
} 

extension browsingForPeers : ConnectionManagerDelegate { 

func foundHost(manager: ConnectionManager) { 
    OperationQueue.main.addOperation { 
     if self.connectionManager.session.connectedPeers.count > 0 { 
      self.header.text = "\(self.connectionManager.session.connectedPeers[0].displayName)'s game" 
      self.activityMonitor.alpha = 0 
     } 
     if self.connectionManager.session.connectedPeers.count == 0 { 
      self.header.text = "Searching for game" 
      self.activityMonitor.alpha = 1 
     } 
    } 
} 

func hostInitsGame(manager: ConnectionManager) { 
    OperationQueue.main.addOperation { 
     self.switchViewControllers(active: true) 
    } 
} 
} 

extension ViewController : ServiceManagerDelegate { 
func changeImage(manager: ConnectionManager, imageData: Data) { 
    self.imageView.image = nil 
    self.imageView.image = UIImage(data: imageData) 
} 

} 

protocol ConnectionManagerDelegate { 
func hostInitsGame(manager: ConnectionManager) 
func foundHost(manager: ConnectionManager) 
} 

protocol ServiceManagerDelegate { 
func changeImage(manager: ConnectionManager, imageData: Data) 
} 

ブラウザのファイルクリックした

そして最後に描画コントローラ(これは問題を有するものである、と私はすべての描画コードを削除)インクルードにはない奇妙な方法で奇妙な書式設定のXcodeのコピーのために申し訳ありません

import UIKit 
import MultipeerConnectivity 

class ViewController: UIViewController { 
var globalConstant: Constants? 

let connectionManager = ConnectionManager() 

@IBOutlet var imageView: UIImageView! 
@IBOutlet weak var more: UIButton! 
@IBOutlet weak var brushOptions: UIButton! 
@IBOutlet weak var colorOptions: UIButton! 
@IBOutlet weak var eraser: UIButton! 

@IBOutlet weak var brushSml: UIButton! 
@IBOutlet weak var brushMed: UIButton! 
@IBOutlet weak var brushLrg: UIButton! 

@IBOutlet weak var redButton: UIButton! 
@IBOutlet weak var orangeButton: UIButton! 
@IBOutlet weak var yellowButton: UIButton! 
@IBOutlet weak var greenButton: UIButton! 
@IBOutlet weak var lightBlueButton: UIButton! 
@IBOutlet weak var blueButton: UIButton! 
@IBOutlet weak var pinkButton: UIButton! 
@IBOutlet weak var greyButton: UIButton! 
@IBOutlet weak var blackButton: UIButton! 

@IBOutlet weak var slider: UISlider! 

var uiimage: UIImage! 
var ciimage: CIImage! 
var data: Data! 


override var prefersStatusBarHidden: Bool { 
    return true 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    connectionManager.serviceDelegate = connectionManager.connectionDelegate as! ServiceManagerDelegate? 
    NSLog("%@", "View loaded with \ (connectionManager.session.connectedPeers.count) peers") //Outputs 0 
//  connectionManager.session.disconnect() 
//  NSLog("%@", "Disconnected") 

@IBAction func doneButtonClicked(_ sender: UIButton) { 
    imageView.isUserInteractionEnabled = false 
    uiimage = imageView.image 
    if uiimage != nil { 
     data = UIImagePNGRepresentation(uiimage) 
     connectionManager.sendImage(imageData: data) 
     imageView.image = nil 
     imageView.image = UIImage(data: data) 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

} 

タブを押し続ける。先生のおかげで、マット。

+1

あなたの接続マネージャークラスはシングルトンではありません。 browsingForPeers viewcontrollerとViewController viewcontrollerには異なる接続マネージャオブジェクトがあり、browsingForPeersでブラウジングを開始するだけです。 – koropok

+0

彼らは接続してデータを共有しているためです。それは私がそれが台無しになるビューコントローラを切り替えるときです。私は変数を適切に渡しているとは思わない。何か案は? – Matt319

+0

誰もが考えている? @koropokが言ったように、値を前後に渡す必要があるかもしれないと私は信じている。ありがとう – Matt319

答えて

0

私は別のクラスでそれを呼び出すと、クラスの新しいインスタンスを作成していました。それで、初期化されていなかった私の値はすべてゼロに等しいのです。これは私がそれを修正した方法です...

let connectionManager = ConnectionManager() 

これはインスタンスであり、参照ではありませんでした。

var connectionManager: ConnectionManager? 

これはすでに存在するクラスへの参照が作成されます。

私がしなければならなかったもう1つのことは、別のビューコントローラにセグをしてすべての値を渡すときでした。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if let destinationViewController = segue.destination as? ViewController { 
     destinationViewController.connectionManager = self.connectionManager 
    } 
} 

私は、これがこの問題を抱えている他の誰にも役立つことを願っています。

関連する問題