在两个不同设备上显示相同的随机图像视图

时间:2016-07-26 07:57:55

标签: ios swift xcode

我在一个视图控制器中有两个图像视图。我将图像视图连接到随机数生成器,该生成器选择1到52之间的数字。然后获取该数字,转到数组,并显示与该数字对应的数组中的图像。唯一的问题是,当我连接第二台设备时,图像不一样。两个图像都是随机生成的。我还会在此处链接Google云端硬盘下载,因为我无法容纳我的所有屏幕截图:https://drive.google.com/open?id=0BzD3GwjKw6LGc1BCa2pGVnZLU2c

TTTImageView 1 of 1

我正在使用Xcode 7.3.1。

ViewController.swift中的代码:

import UIKit
import MultipeerConnectivity

class ViewController: UIViewController, MCBrowserViewControllerDelegate {

    @IBOutlet var fields: [TTTImageView]!

    var currentPlayer:String!

    var appDelegate:AppDelegate!

    override func viewDidLoad() {
        super.viewDidLoad()
        appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.mpcHandler.setupPeerWithDisplayName(UIDevice.currentDevice().name)
        appDelegate.mpcHandler.setupSession()
        appDelegate.mpcHandler.advertiseSelf(true)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "peerChangedStateWithNotification:", name: "MPC_DidChangeStateNotification", object: nil)

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleReceivedDataWithNotification:", name: "MPC_DidReceiveDataNotification", object: nil)
        setupField()
        currentPlayer = "x"
    }


    @IBAction func connectWithPlayer(sender: AnyObject) {

        if appDelegate.mpcHandler.session != nil{
            appDelegate.mpcHandler.setupBrowser()
            appDelegate.mpcHandler.browser.delegate = self

            self.presentViewController(appDelegate.mpcHandler.browser, animated: true, completion: nil)

        }
    }

    func peerChangedStateWithNotification(notification:NSNotification){
        let userInfo = NSDictionary(dictionary: notification.userInfo!)

        let state = userInfo.objectForKey("state") as! Int

        if state != MCSessionState.Connecting.rawValue{
            self.navigationItem.title = "Connected"
        }

    }

    func handleReceivedDataWithNotification(notification:NSNotification){
        let userInfo = notification.userInfo! as Dictionary
        let receivedData:NSData = userInfo["data"] as! NSData

        let message = (try! NSJSONSerialization.JSONObjectWithData(receivedData, options: NSJSONReadingOptions.AllowFragments)) as! NSDictionary
        let senderPeerId:MCPeerID = userInfo["peerID"] as! MCPeerID
        let senderDisplayName = senderPeerId.displayName

        if message.objectForKey("string")?.isEqualToString("New Game") == true{
            let alert = UIAlertController(title: "War", message: "\(senderDisplayName) has started a new Game", preferredStyle: UIAlertControllerStyle.Alert)

            alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))

            self.presentViewController(alert, animated: true, completion: nil)

            resetField()
        }else{
            let field:Int? = message.objectForKey("field")?.integerValue
            let player:String? = message.objectForKey("player") as? String

            if field != nil && player != nil{
                fields[field!].player = player
                fields[field!].sePlayer(player!)

                if player == "x"{
                    currentPlayer = "o"
                }else{
                    currentPlayer = "x"
                }


            }

        }


    }

    func fieldTapped (recognizer:UITapGestureRecognizer){
        let tappedField  = recognizer.view as! TTTImageView
        tappedField.sePlayer(currentPlayer)

        let messageDict = ["field":tappedField.tag, "player":currentPlayer]



        let messageData = try? NSJSONSerialization.dataWithJSONObject(messageDict, options: NSJSONWritingOptions.PrettyPrinted)

        var error:NSError?

        do {
            try appDelegate.mpcHandler.session.sendData(messageData!, toPeers: appDelegate.mpcHandler.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable)
        } catch let error1 as NSError {
            error = error1
        }

        if error != nil{
            print("error: \(error?.localizedDescription)", terminator: "")
        }

    }

    func setupField(){
        for index in 0 ... fields.count - 1{
            let gestureRecognizer = UITapGestureRecognizer(target: self, action: "fieldTapped:")
            gestureRecognizer.numberOfTapsRequired = 1

            fields[index].addGestureRecognizer(gestureRecognizer)
        }
    }

    func resetField(){
        for index in 0 ... fields.count - 1{
            fields[index].image = nil
            fields[index].activated = false
            fields[index].player = ""
        }

        currentPlayer = "x"
    }


    @IBAction func newGame(sender: AnyObject) {
        resetField()

        let messageDict = ["string":"New Game"]

        let messageData = try? NSJSONSerialization.dataWithJSONObject(messageDict, options: NSJSONWritingOptions.PrettyPrinted)

        var error:NSError?

        do {
            try appDelegate.mpcHandler.session.sendData(messageData!, toPeers: appDelegate.mpcHandler.session.connectedPeers, withMode: MCSessionSendDataMode.Reliable)
        } catch let error1 as NSError {
            error = error1
        }

        if error != nil{
            print("error: \(error?.localizedDescription)", terminator: "")
        }
    }

    func browserViewControllerDidFinish(browserViewController: MCBrowserViewController) {
        appDelegate.mpcHandler.browser.dismissViewControllerAnimated(true, completion: nil)
    }

    func browserViewControllerWasCancelled(browserViewController: MCBrowserViewController) {
        appDelegate.mpcHandler.browser.dismissViewControllerAnimated(true, completion: nil)
    }

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

TTTImageView中的代码:

import UIKit

class TTTImageView: UIImageView {

    var player:String?
    var activated:Bool! = false

    var cardNamesList:[String] = ["card1", "card2", "card3", "card4", "card5", "card6", "card7", "card8", "card9", "card10", "card11", "card12", "card12", "card14", "card15", "card16", "card17", "card18", "card19", "card20", "card21", "card22", "card23", "card24", "card25", "card26", "card27", "card28", "card29", "card30", "card31", "card32", "card33", "card34", "card35", "card36", "card37", "card38", "card39", "card40", "card41", "card42", "card43", "card44", "card45", "card46", "card47", "card48", "card49", "card50", "card51", "card52"]


    func sePlayer (_player:String){
        self.player = _player

        if activated == false{
            if _player == "x"{
                let firstRandomNumber = Int(arc4random_uniform(52))
                //construct a sting with the random number
                let firstCardString:String = self.cardNamesList[firstRandomNumber]

                //set the first card image view to the asset corresponding to the randomized number
                self.image = UIImage(named: firstCardString)

                //self.image = UIImage(named: "x")
            }else{
                //Randomize a number for the Second image view
                let secondRandomNumber = Int(arc4random_uniform(52))
                //Construct a sting with the random number
                let secondCardString:String = self.cardNamesList[secondRandomNumber]
                //Set the Second card image view to the asset corresponding to the randomized number
                self.image = UIImage(named: secondCardString)
            }
            activated = true
        }
    }
}

MPCHandler中的代码:

import UIKit
import MultipeerConnectivity

class MPCHandler: NSObject, MCSessionDelegate {
    var peerID:MCPeerID!
    var session:MCSession!
    var browser:MCBrowserViewController!
    var advertiser:MCAdvertiserAssistant? = nil

    func setupPeerWithDisplayName (displayName:String){
        peerID = MCPeerID(displayName: displayName)
    }

    func setupSession(){
        session = MCSession(peer: peerID)
        session.delegate = self
    }

    func setupBrowser(){
        browser = MCBrowserViewController(serviceType: "my-game", session: session)

    }

    func advertiseSelf(advertise:Bool){
        if advertise{
            advertiser = MCAdvertiserAssistant(serviceType: "my-game", discoveryInfo: nil, session: session)
            advertiser!.start()
        }else{
            advertiser!.stop()
            advertiser = nil
        }
    }

    func session(session: MCSession, peer peerID: MCPeerID, didChangeState state: MCSessionState) {
        let userInfo = ["peerID":peerID,"state":state.rawValue]
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            NSNotificationCenter.defaultCenter().postNotificationName("MPC_DidChangeStateNotification", object: nil, userInfo: userInfo)
        })
    }

    func session(session: MCSession, didReceiveData data: NSData, fromPeer peerID: MCPeerID) {
        let userInfo = ["data":data, "peerID":peerID]
        dispatch_async(dispatch_get_main_queue(), { () -> Void in
            NSNotificationCenter.defaultCenter().postNotificationName("MPC_DidReceiveDataNotification", object: nil, userInfo: userInfo)
        })
    }

    func session(session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, atURL localURL: NSURL, withError error: NSError?) {
    }

    func session(session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, withProgress progress: NSProgress) {
    }

    func session(session: MCSession, didReceiveStream stream: NSInputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
    }
}

0 个答案:

没有答案