Root ViewController не реагирует на сообщение из представления SpriteKit
Я использую root viewcontroller
отображать пару ярлыков для отслеживания результатов и т. д., что работает нормально. Тем не менее, корневой viewcontroller не отвечает на сообщения от сцены сразу же, когда сцена загружается.
Ситуация такая: UIViewController
подарки SKView
где я инициализирую MyScene
к тому же (обычный материал SpriteKit). Сразу в MyScene я загружаю уровень из json-file
, который содержит количество возможных точек на этом конкретном уровне. Когда уровень загружен, я пытаюсь отправить количество возможных точек обратно в мой корневой viewcontroller, чтобы он мог отобразить его в метке.
Я пытался установить свойство 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
-метод, чтобы взять целое число вместо уведомления).