Root ViewController不响应来自SpriteKit视图的消息

时间:2014-07-19 21:06:03

标签: ios uiviewcontroller sprite-kit nsnotificationcenter skview

我正在使用root viewcontroller显示几个标签来跟踪分数等,这很正常。但是,根视图控制器在加载场景时不会立即响应来自场景的消息。

情况是这样的:UIViewController呈现SKView我在其上初始化MyScene(正常的SpriteKit内容)。我立即在MyScene中加载json-file的级别,其中包含该特定级别上可能的点数。当级别加载完成后,我尝试将可能的点数发送回我的根视图控制器,因此它可以在标签中显示它。

我尝试在myScene.mainViewController = self上的viewWillLayoutSubviews设置属性ViewController,然后仅[self.mainViewController setInitialScore:_bgLayer.maxScore];,但方法setInitialScore永远不会触发。我也尝试使用NSNotificationCenter,但这也不起作用。

但是,每当玩家收集一个点(稍后发生)时,我会在self.mainViewController中调用一个方法,并且该方法正常。所以问题似乎是ViewController没有完成加载或其他东西,所以它没有立即响应。

我怎么解决这个问题?

编辑1: 以下是按要求提供的一些代码:

ViewController.m

- (void)viewWillLayoutSubviews {
  [super viewWillLayoutSubviews];

  SKView *skView = (SKView *)self.view;
  if (!skView.scene) {
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;

    // Create and configure the scene.
    MyScene* scene = [MyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;
    scene.mainViewController = self;

    // Present the scene.
    [skView presentScene:scene];

    self.numLives = bStartNumLives;
    self.score = 0;
    [self resetLabels];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setInitialRings:) name:@"setInitialRings" object:nil];
  }
}

- (void)setInitialRings:(NSNotification *)notification {
  NSLog(@"Initial rings set");
  NSDictionary *userInfo = [notification userInfo];
  NSInteger rings = [(NSNumber *)[userInfo objectForKey:@"rings"] integerValue];

  self.numRings = rings;

  [self resetLabels];
}

MyScene.m

- (void)createWorld {
  _bgLayer = [self createScenery];
  NSLog(@"world created setting initial rings");
  NSDictionary *userInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:_bgLayer.numRings] forKey:@"rings"];
  [[NSNotificationCenter defaultCenter] postNotificationName:@"setInitialRings" object:userInfo];

  _worldNode = [SKNode node];
  [_worldNode addChild:_bgLayer];
  [self addChild:_worldNode];

  self.anchorPoint = CGPointMake(0.5, 0.5);
  _worldNode.position = CGPointMake(-_bgLayer.layerSize.width / 2, -_bgLayer.layerSize.height / 2);
}

从这段代码中可以看出,我正在尝试使用NSNotificationCenter。我也尝试手动调用[self.mainViewController setInitialRings:_bgLayer.numRings];(但更改setInitialRings - 方法取整数而不是通知。)

0 个答案:

没有答案