从 AppDelegate 调用 GameScene 方法(Swift 3、SpriteKit、Xcode 8)

Posted

技术标签:

【中文标题】从 AppDelegate 调用 GameScene 方法(Swift 3、SpriteKit、Xcode 8)【英文标题】:Call GameScene method from AppDelegate (Swift 3, SpriteKit, Xcode 8) 【发布时间】:2017-04-12 20:55:18 【问题描述】:

我正在使用 Spritekit 和 swift 3 创建游戏,我的问题是当我尝试从 applicationWillResignActive(_ application: UIApplication) 方法内的 AppDelegate 文件中调用我的 GameScene 类(SKScene 的子类)中的 pauseGame() 方法时。

我已经尝试实例化 GameScene 类,然后以这种方式调用我的 AppDelegate 文件中的方法,虽然没有编译器错误它不起作用:

func applicationWillResignActive(_ application: UIApplication) 

    if let gameScene = GameScene(fileNamed: "GameScene") 

        gameScene.pauseGame()
    

我该如何解决这个问题?提前致谢。

【问题讨论】:

applicationwillresignactive 发出通知,你可以在你的游戏场景类中收听,无需在app delegate中工作 @Knight0fDragon 您应该将其发布为答案,而不是评论 @BadgerBadger 这需要我实际写一个答案,我懒得这样做 @Knight0fDragon 哈哈哈 【参考方案1】:

您正在创建 GameScene 的新实例。 要暂停现有实例,您需要在 AppDelegate 中添加对它的引用。

更好的解决方案是注册 GameScene 类以在应用程序进入后台时接收通知。这是将这些类与 AppDelegate 耦合的一个很好的替代方法。

在你的 GameScene 类的 viewDidLoad() 函数中添加:

let app = UIApplication.shared

//Register for the applicationWillResignActive anywhere in your app.
NotificationCenter.default.addObserver(self, selector: #selector(GameScene.applicationWillResignActive(notification:)), name: NSNotification.Name.UIApplicationWillResignActive, object: app)

将此函数添加到 GameScene 类以响应收到的通知:

func applicationWillResignActive(notification: NSNotification) 
     pauseGame()

【讨论】:

我进行了编辑,将 ViewController 更改为 GameScene,出于某种原因,它以匿名方式记录了它,所以如果您想更改它,我们非常欢迎。

以上是关于从 AppDelegate 调用 GameScene 方法(Swift 3、SpriteKit、Xcode 8)的主要内容,如果未能解决你的问题,请参考以下文章

从 AppDelegate 调用 navigationController

从 AppDelegate 调用委托函数不起作用

如何从appdelegate调用方法[重复]

如何从 AppDelegate 调用在 ViewController 中声明的方法

无法从 AppDelegate 调用 ViewController 方法

AppDelegate 从 m File + presentViewController 调用函数