我正在使用 SpriteKit 使用 Swift 制作游戏。
我正在使用界面生成器来定位所有按钮(菜单、重试等),以便我可以使用自动布局。然后,我在游戏结束函数中使用 NSNotificationCenter 在 SKScene 中显示这些按钮。我使用 NSNotificationCenter 在 SKScene 中显示 UIKit 内容没有任何问题。
这是我的问题,我会尽力解释。
当你游戏结束时,会显示一个名为重试的 UIButton。我在 SKScene 中为重试函数设置了一个 NSNotificationCenter 观察器,并在 IBAction 中为 viewController 中的按钮调用 postNotificationName。当我第一次加载游戏时,通知效果很好。我可以玩、重试、玩、重试。
但是,当我返回主菜单并再次加载游戏并按重试时,游戏崩溃了。有时它只是(lldb)。其他时候,将其无法识别的选择器发送到实例。
这是我到目前为止的代码: 这是 View Controller
class GameSceneViewController: UIViewController{
@IBOutlet weak var homeBtn: UIButton!
@IBOutlet weak var retryBtn: UIButton!
var userDefaults = NSUserDefaults.standardUserDefaults()
//MARK: Button Actions
@IBAction func returnToMenu(sender: UIButton) {
self.dismissViewControllerAnimated(true, completion: nil)
}
@IBAction func retryGame(sender: UIButton) {
NSNotificationCenter.defaultCenter().postNotificationName("retrygame", object: nil)
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
var scene: GameScene!
let skView = view as SKView
skView.showsFPS = false
skView.showsNodeCount = true
skView.showsPhysics = false
skView.ignoresSiblingOrder = true
scene = GameScene(size: skView.bounds.size)
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
这是游戏场景:
class GameScene: SKScene {
//MARK: The View
override func didMoveToView(view: SKView) {
self.backgroundColor = UIColor.grayColor()
setUpGame()
NSNotificationCenter.defaultCenter().addObserver(self, selector: "retry", name: "retrygame", object: nil)
}
func retry(){
print("test")
}
为什么会发生这种情况?为什么观察者在第一场比赛中首先工作,但在我离开并返回 View 后却失败了?如果您需要更多信息,请发表评论。任何帮助将不胜感激!
最佳答案
当对象取消初始化时,您需要从 NSNotificationCenter 中删除作为观察者的 GameScene。
下面的代码应该可以解决您的问题。
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self)
}
关于ios - 将 NSNotificationCenter 与 SkScene 一起使用到 UIViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27652274/