набор спрайтов - получать уведомления, когда узел был добавлен в сцену

У меня есть подкласс SKNode, которого я хочу получать уведомления, когда они добавляются в сцену. Зная, что у SKNode есть свойство scene, я попытался использовать KVO, но по какой-то причине это не работает.

- (id)init
{
    self = [super init];
    if (self)
    {
        [self addObserver:self forKeyPath:@"scene" options:NSKeyValueObservingOptionNew context:nil];
    }
    return self;
}

- (void)dealloc
{
    [self removeObserver:self forKeyPath:@"scene"];
}

+ (instancetype)gameWorld
{
    return [[self alloc] init];
}

#pragma mark - Observer methods

// never called
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (object == self && [keyPath isEqualToString:@"scene"])
    {
        KKScene *scene = change[NSKeyValueChangeNewKey];
        NSLog(@"%@", scene);
    }
}

Есть ли способ получить уведомление, когда узел был добавлен в сцену? А может, КВО работает хорошо, но я что-то не так сделал?


person Yaman    schedule 13.03.2014    source источник
comment
возможный дубликат SKSpriteNode, добавленный/удаленный из родительского хука   -  person LearnCocos2D    schedule 14.03.2014
comment
Я что-то понимаю т.к. Свойство scene устанавливается только в том случае, если сцена является прямым родителем узла. Я думал, что даже дети будут иметь сцену   -  person Yaman    schedule 14.03.2014
comment
Вы можете наблюдать родительское свойство узлов вместо свойства сцены.   -  person ZeMoon    schedule 14.03.2014
comment
@Yaman, это неправильно, сцена устанавливается для всех узлов, но только после того, как узел был добавлен как дочерний к другому узлу, который, в свою очередь, также является дочерним элементом узла, который уже имеет допустимое свойство сцены ( или сама сцена). В основном свойство сцены допустимо только в том случае, если узел фактически является частью графа сцены. KVO, вероятно, не работает, потому что это свойство не совместимо с KVO, Sprite Kit за кулисами представляет собой средство визуализации C ++ и обходит многие накладные расходы Objective-C.   -  person LearnCocos2D    schedule 14.03.2014
comment
@LearnCocos2D Ммм, понятно. Спасибо за эти подробности!   -  person Yaman    schedule 14.03.2014


Ответы (2)


Мое решение состоит в том, чтобы иметь метод, который добавляет узлы и общий подкласс SKNode, на котором я основываю все свои узлы. Этот подкласс имеет "-(void)onEnterScene", который вызывается методом add'er сразу после его добавления на сцену.

person Theis Egeberg    schedule 14.03.2014

Переопределите эту функцию в вашем подклассе SKScene:

-(void)addChild:(SKNode *)node {
    [super addChild:node];
    NSLog(@"added child");
}

Уже ответили здесь

person michaelsnowden    schedule 31.08.2014