[英]App Hanging on “let SKView as! SKView” (Swift)
我试图创建一个基于SpriteKit的游戏,并尝试建立基本的蓝牙连接,然后再继续,但是从菜单到GameScene的搜索过程中我的游戏崩溃了,并且我得到了“无法转换'UIView类型的值'至'SKView'”错误。 我的游戏菜单如下:
import UIKit
import MultipeerConnectivity
class TitleScreenViewController: UIViewController, MCBrowserViewControllerDelegate {
@IBOutlet weak var TitleLabel: UILabel!
@IBOutlet weak var PlayLocallyButton: UIButton!
@IBOutlet weak var PlayOnlineButton: UIButton!
@IBOutlet weak var SettingsButton: UIButton!
@IBOutlet weak var GameCenterButton: UIButton!
var appDelegate:AppDelegate!
override func viewDidLoad() {
super.viewDidLoad()
PlayLocallyButton.layer.borderColor = UIColor.blackColor().CGColor
PlayLocallyButton.layer.cornerRadius = 10
PlayLocallyButton.layer.borderWidth = 1
PlayOnlineButton.layer.borderColor = UIColor.blackColor().CGColor
PlayOnlineButton.layer.cornerRadius = 10
PlayOnlineButton.layer.borderWidth = 1
SettingsButton.layer.borderColor = UIColor.blackColor().CGColor
SettingsButton.layer.cornerRadius = 10
SettingsButton.layer.borderWidth = 1
GameCenterButton.layer.borderColor = UIColor.blackColor().CGColor
GameCenterButton.layer.cornerRadius = 10
GameCenterButton.layer.borderWidth = 1
appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
appDelegate.mpcHandler.setupPeerWithDisplayName(UIDevice.currentDevice().name)
appDelegate.mpcHandler.setupSession()
appDelegate.mpcHandler.selfAdvertise(true)
}
@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 browserViewControllerDidFinish(browserViewController: MCBrowserViewController!) {
appDelegate.mpcHandler.browser.dismissViewControllerAnimated(true, completion: nil)
self.performSegueWithIdentifier("OverToGame", sender: self)
}
func browserViewControllerWasCancelled(browserViewController: MCBrowserViewController!) {
appDelegate.mpcHandler.browser.dismissViewControllerAnimated(true, completion: nil)
}
菜单选择要显示的GameScene并显示以下我的GameViewController。 这包含它悬挂的行
import UIKit
import SpriteKit
import MultipeerConnectivity
extension SKNode {
class func unarchiveFromFile(file : NSString) -> SKNode? {
if let path = NSBundle.mainBundle().pathForResource(file as String, ofType: "sks") {
var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as! GameScene
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
class GameViewController: UIViewController {
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.selfAdvertise(true)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let skView = self.view as! SKView
if skView.scene == nil {
skView.showsFPS = true
skView.showsNodeCount = true
let gameScene = GameScene(size: skView.bounds.size)
gameScene.scaleMode = SKSceneScaleMode.AspectFill
skView.presentScene(gameScene)
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
我什至以正确的方式呈现场景吗?
您的GameViewController
类属于UIViewController
类。 UIViewController
的view
属性属于UIView
类,而不是SKView
类。
因此,当您编写时, let skView = self.view as! SKView
let skView = self.view as! SKView
你说,嘿,我知道肯定是我的self.view
应该是的SKView
类型,由所示as!
。 但是事实并非如此,因此幸运的是,编译器会在运行应用程序并将其崩溃之前将您停止。
SKView
是SKView
的view
属性的SKScene
要使用Sprite Kit编写游戏,您必须了解UIViewController
和SKScene
之间的区别祝您好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.