2017-08-19 44 views
1

我有一個SKScene,它有一個暫停方法。我希望能夠做這樣的事情:如何在Swift中從AppDelegate引用當前SKScene

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

不過,我不知道怎麼去參考,我SKScene從AppDelegate中。

我嘗試使用

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

那會是足夠的,有效的,在每次刪除觀察者?

+0

不,它只會在場景從內存中刪除時將其刪除。如果場景停留在內存中但離開當前視圖,觀察者仍然存在。我不知道你的遊戲是如何設計的,你至少保護了自己的場景從內存中刪除,所以你的應用程序不會在退出時崩潰。 – Knight0fDragon

回答

2

我會放棄你的想法。在iOS中,通知會在應用程序事件發生時發送。在你的情況下,通知被稱爲UIApplicationWillTerminate

你想要做的是鉤入你的場景類的這個通知,我會建議在didMove(to:)方法。

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

現在,當你做到這一點,你需要記住,當你刪除的場景可去除觀察者 ,所以你要使用的代碼:

NotificationCenter.default.removeObserver(self) 

在瞬間場景被刪除。我會建議至少把它放在deinit

現在在Swift 4中,事情有點改變。您需要將@objc添加到您的pauseLevel函數,以便它可以暴露給客觀的c庫。

+0

你可以檢查我最後的編輯嗎? – Pablo

相關問題