2015-06-08 2 views
0

Исключение:Почему -reoveFromParent в SKNode бросает это исключение?

- [__ NSArrayI removeExactObject]: непризнанные селектор направлен например

Я хочу, чтобы иметь представление SKScene в NSTreeController, для этого я использую Proxy, который содержит ссылки на SKNode и его прокси-дочерние элементы, каждый из которых содержит класс Proxy, который в свою очередь используется в качестве представленного объекта в контроллере дерева.

NSTreeController 
|-Proxy    -> SKScene 
    |-Proxy   ->  |-SKSpriteNode 
    |-Proxy   ->  |-SKNode 
     |-Proxy  ->   |-SKSpriteNode 
     |-Proxy  ->   |-SKShapeNode 

Все узлы добавляются или удаляются на сцену с помощью этих методов в классе Proxy

@interface Proxy : NSObject 
+ (instancetype)proxyWithNode:(id)node; 
@end 

@implementation Proxy { 
    SKNode *_node; 
    NSMutableArray *_proxyChildren; 
} 

+ (instancetype)proxyWithNode:(id)node { 
    if (node) { 
     Proxy *proxy = [[Proxy alloc] init]; 
     proxy.node = node; 
     return proxy; 
    } 
    return nil; 
} 

- (void)setNode:(id)node { 
    _proxyChildren = [NSMutableArray array]; 

    for (id child in [node children]) { 
     Proxy *childProxy = [Proxy proxyWithNode:child]; 
     [_proxyChildren addObject:childProxy]; 
    } 

    _node = node; 
} 

- (id)node { 
    return _node; 
} 

- (void)setChildren:(NSMutableArray *)children { 

    //[_node removeAllChildren]; 
    [self cleanUpChildren:_node]; 

    for (Proxy *child in children) { 
     [_node addChild:child.node]; 
    } 

    _proxyChildren = children; 
} 

- (NSMutableArray *)children { 
    return _proxyChildren; 
} 

- (void)cleanUpChildren:(SKNode *)node { 
    for (SKNode *child in node.children) { 
     [self cleanUpChildren:child]; 
     //assert(child.parent == node); 
     @try { 
      //NSLog(@"\n%p %p\n%@\n%@\n\n", node, child, node, child); 
      [child removeFromParent]; 
     } 
     @catch (NSException *exception) { 
      NSLog(@"WTF!"); 
     } 

    } 
} 
@end 

Это, как я заполнить контроллер дерева со сценой

[_treeController setContent:[Proxy proxyWithNode:scene]]; 

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

Это, как я удаление прокси-узел

[_treeController removeObjectAtArrangedObjectIndexPath:indexPath]; 

ответ

0

Это быстрый и грязный исправить я придумал:

- (void)setChildren:(NSMutableArray *)children { 

    id privateChildren = [_node valueForKey:@"_children"]; 
    if (![privateChildren isKindOfClass:[NSMutableArray class]]) { 
     [_node setValue:[privateChildren mutableCopy] forKey:@"_children"]; 
    } 

    [_node removeAllChildren]; 
    //[self cleanUpChildren:_node]; 

    //... 
} 

проверяю ли частный Ивар _children является inmutable массив , если это так, я делаю это изменчивой копией, прежде чем пытаться удалить детей.