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