如何从Swift中的AppDelegate引用当前的SKScene

时间:2017-08-19 00:23:18

标签: swift sprite-kit

我有一个具有暂停方法的SKScene。我希望能够做到这样的事情:

func applicationWillTerminate(_ application: UIApplication) {
    pauseLevel()
}

但是,我不知道如何从AppDelegate获取对SKScene的引用。

我尝试使用

 application.inputView

但是,这是一个UIView。我怎样才能获得SKScene?

修改

deinit {
    NotificationCenter.default.removeObserver(self)
}

override func didMove(to view: SKView) {
    self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    self.backgroundColor = UIColor(red:0.17, green:0.24, blue:0.31, alpha:1.0)
    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    NotificationCenter.default.addObserver(self, selector: #selector(runPause), name: .UIApplicationWillResignActive, object: nil)
}

每次移除观察者是否足够有效?

1 个答案:

答案 0 :(得分:2)

我会废弃你的思维方式。在iOS中,会在应用程序事件发生时发送通知。在您的情况下,通知称为UIApplicationWillTerminate

您想要做的是在Scene类中挂钩此通知,我建议使用didMove(to:)方法。

    NotificationCenter.default.addObserver(self, selector: #selector(pauseLevel), name: .UIApplicationWillTerminate, object: nil)

现在,当你这样做时,你需要记住删除观察者  当你删除场景时,所以你想使用代码:

   NotificationCenter.default.removeObserver(self)

在场景被移除的瞬间。我建议至少把它放在deinit

现在在Swift 4中,事情发生了一些变化。您需要将@objc添加到pauseLevel函数,以便可以将其暴露给目标c库。