为什么applicationWillResignActive方法不起作用?

时间:2015-01-25 13:44:05

标签: ios objective-c sprite-kit

在我的GameScene.m中,我有一个名为 wentToBackGround 的方法。此方法由AppDelegate中的 applicationWillResignActive 调用:

GameScene *gameScene = [[GameScene alloc]init];
[gameScene wentToBackground];

在goToBackGround中,我移动了我的播放器精灵(只是为了测试它是否有效),如下所示:

-(void)wentToBackground {
  NSLog(@"BG");
  self.player.position = CGPointMake(CGRectGetMidX(self.frame), 1000);
}

NSLog 有效,但球员位置保持不变。这是因为SpriteKit一旦进入BG就会自动暂停一切。我该如何解决这个问题。我最终希望有一个暂停菜单,一旦用户离开应用程序就会打开。 我该如何正确地做到这一点?

我认为它也可能不起作用,因为我创建了 GameScene 的新实例。我如何使用旧实例? (旧实例是在另一个场景中创建的, TitleScene

1 个答案:

答案 0 :(得分:2)

  

我认为它也可能不起作用,因为我制作了一个新的GameScene实例

正确,你懂了!做得好。请记住(我认为你现在正在抓住这个),一个类只是一个模板。应用程序中的对象是实例,您可以创建一个类的许多实例。所以当你说

[[GameScene alloc]init]

您正在制作实例。这是合法但毫无意义的;向它发送wentToBackground消息没有任何用处,因为它不在您的界面中。您要与之交谈的GameScene实例(界面中的实例)位于其他地方。

获取对特定现有实例的引用可能很棘手。你有时必须事先安排好事情才能做到。但是,我认为你可以在这里避免整个问题。 UIApplication不仅具有应用委托方法,还具有通知,可让您知道您将辞职。因此,只需拥有该通知的GameScene注册表,现在您根本不必涉及应用程序代理。

以下是该通知的文档:

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/#//apple_ref/c/data/UIApplicationWillResignActiveNotification

任何对象都可以注册通知,因此这是一种确定您的GameScene想要被告知停用的方法。