現在、マルチペイパー接続を使用して画像を描画して送信できるテストアプリケーションを作成しています。ホストには接続ビューコントローラがあり、他のピアには別の接続ビューコントローラがあります。ピアが接続されると、ホストはゲームをプレイし、すべてのピアのビューコントローラは、それらが接続されていることを証明する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.
}
}
タブを押し続ける。先生のおかげで、マット。
あなたの接続マネージャークラスはシングルトンではありません。 browsingForPeers viewcontrollerとViewController viewcontrollerには異なる接続マネージャオブジェクトがあり、browsingForPeersでブラウジングを開始するだけです。 – koropok
彼らは接続してデータを共有しているためです。それは私がそれが台無しになるビューコントローラを切り替えるときです。私は変数を適切に渡しているとは思わない。何か案は? – Matt319
誰もが考えている? @koropokが言ったように、値を前後に渡す必要があるかもしれないと私は信じている。ありがとう – Matt319