ios - 将 NSNotificationCenter 与 SkScene 一起使用到 UIViewController

标签 ios swift sprite-kit nsnotificationcenter

我正在使用 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/

相关文章:

ios - iMessage 应用程序扩展可以使用主机应用程序中定义的 View Controller 吗?

ios - 在 iOS 中使用 Core Graphics 创建渐变

ios - Swift 类变量崩溃 Interface Builder 实时渲染

iOS测试游戏中心排行榜不同测试用户

ios - 如何创建一个已经形成粒子的 SKEmitterNode

ios - iphone UIBarButtonItem : setBackgroundImage - Stretched

ios - 图像未填充在 iOS 模拟器中的页眉上

swift - 不能用 SKNode 类型的参数列表调用 !=?

swift - 删除 UItableView 中多余的空格

ios - 生成未显示的 SKScene 内容的图像