如何从Swift中的AppDelegate引用当前场景

如何从Swift中的AppDelegate引用当前场景,swift,sprite-kit,Swift,Sprite Kit,我有一个场景,有一个暂停方法。我希望能够做到以下几点: func applicationWillTerminate(_ application: UIApplication) { pauseLevel() } 但是,我不知道如何从AppDelegate获取对我的场景的引用 我试着用 application.inputView 然而,这是一种观点。我怎样才能得到一个场景 编辑 deinit { NotificationCenter.default.removeObserver

我有一个场景,有一个暂停方法。我希望能够做到以下几点:

func applicationWillTerminate(_ application: UIApplication) {
    pauseLevel()
}
但是,我不知道如何从AppDelegate获取对我的场景的引用

我试着用

 application.inputView
然而,这是一种观点。我怎样才能得到一个场景

编辑

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)
}

这是否足以有效地每次移除观察者?

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

我建议使用
didMove(to:)
方法,在场景类中挂接此通知

    NotificationCenter.default.addObserver(self, selector: #selector(pauseLevel), name: .UIApplicationWillTerminate, object: nil)
现在,当您执行此操作时,需要记住删除观察者 删除场景时,因此要使用以下代码:

   NotificationCenter.default.removeObserver(self)
有时场景会被移除。我建议至少把它放在
deinit


现在在Swift 4中,情况发生了一些变化。您需要将
@objc
添加到pauseLevel函数中,以便将其公开给objective c库

否,仅当场景从内存中删除时才会将其删除。如果场景保留在内存中但不在当前视图中,则观察者仍将存在。我不知道你的游戏是如何设计的,当场景从内存中删除时,你至少可以保护自己,这样你的应用程序在退出时不会崩溃。