2015-05-08 3 views
4

Я заселяю NSOUtlineView с помощью NSTreeController.NSOutlineView показывает только первые 2 уровня иерархии NSTreeController

NSTreeController представляет собой трехуровневый иерархический контроллер (CBMovie, CBDisc и CBEpisode), но только первые 2 уровня отображаются в виде схемы.

Реализация одинакова для всех объектов: я реализовал методы для указания детей, подсчета детей и если объект является листом. Эти методы правильно называются для всех объектов (также для тех, которые не отображаются, внуки: CBEpisode).

В обзоре схемы все отображается правильно для первого уровня 2. Но внуки никогда не отображаются, у меня нет возможности расширить их родителей, чтобы увидеть их. Я могу видеть только CBMovie и CBDiscs.

Мне интересно, есть ли еще одна настройка, которую мне не хватает, о том, насколько узкие узлы могут расширяться в конфигурациях NSTreeControllers или NSOutlineView.

Ниже: Реализация в одном из трех узлов. Каждый класс узла имеет другой путь к своим дочерним элементам. Это указано в методе children (NSArray *) (правильно назван).

-(NSArray*)children 
{ 
    return [[self Episodes] allObjects]; 
} 

-(int)childrenCount 
{ 
    return [[self Episodes] count]; 
} 

-(BOOL)isLeaf 
{ 
    return ![[self Episodes] count]; 
} 

Результат регистрации кода. Источник данных, NSTreeController, кажется, имеет правильную структуру.

CBMovie 
     CBDisc 
     CBEpisode 
     CBEpisode 
    CBMovie 
     CBDisc 
     CBDisc 
     CBDisc 
     CBDisc 
    CBMovie 
     CBDisc 
      CBEpisode 
      CBEpisode 

Вот как я заполняю NSOutlineView (на основе ячеек). Я не использую методы источника данных, но я привязываю его программно.

NSMutableDictionary *bindingOptions = [[NSMutableDictionary alloc] initWithCapacity:2]; 

     if (metadata.valueTransformer) { 
      [bindingOptions setObject:metadata.valueTransformer forKey:NSValueTransformerNameBindingOption]; 
     } 
     [bindingOptions setObject:[NSNumber numberWithBool:NO] forKey:NSCreatesSortDescriptorBindingOption]; 
     [bindingOptions setObject:[NSNumber numberWithBool:NO] forKey:NSRaisesForNotApplicableKeysBindingOption]; 

     [newColumn bind:@"value" toObject:currentItemsArrayController withKeyPath:[NSString stringWithFormat:@"arrangedObjects.%@", metadata.columnBindingKeyPath] options:bindingOptions]; 
+0

Вы можете поделиться каким-то кодом? –

+0

Из вашего описания я не вижу никаких проблем. Можете ли вы предоставить более подробную информацию, например, о реализации вашего узла дерева? –

+0

@renfei Мои узлы дерева наследуются от одного класса. Что вам нужно знать более точно? – aneuryzm

ответ

0

Итак, я понял, почему.

Довольно глупо: основной столбец, содержащий стрелки раскрытия, был только шириной 20 пикселей, а стрелки детей имели углубление.

Я использую контурный столбец только для стрелок, а не для названий узлов, поэтому он настолько узкий.

У меня отключен отступ, и теперь я вижу все стрелы.

1

Рассматривая NSTreeController вперед

NSTreeController иерархия контроллер по 3 уровня, но только первые 2 уровня отображаются в режиме структуры.

Вы подтвердили, что все три уровня загружены в ваш NSTreeController? Вы можете сделать это, зарегистрировав его содержимое на консоли с расширением ниже. Если результат, созданный этим кодом, соответствует тому, что появляется в вашем контурном представлении, проблема, вероятно, связана с стороной NSTreeController, а не с контурным видом.

#import "NSTreeController+Logging.h" 

@implementation NSTreeController (Logging) 

// Make sure this is declared in the associated header file. 
-(void)logWithBlock:(NSString * (^)(NSTreeNode *))block { 

    NSArray *topNodes = [self.arrangedObjects childNodes]; 
    [self logNodes:topNodes withIndent:@"" usingBlock:block]; 
} 

// For internal use only. 
-(void)logNodes:(NSArray *)nodes 
    withIndent:(NSString *)indent 
    usingBlock:(NSString * (^)(NSTreeNode *))block { 

    for (NSTreeNode * each in nodes) { 
     NSLog(@"%@%@", indent, block(each)); 
     NSString *newIndent = [NSString stringWithFormat:@" %@", indent]; 
     [self logNodes:each.childNodes withIndent:newIndent usingBlock:block]; 
    } 
} 

@end 

Приведенный выше код не должен быть отрегулирован, все, что вам нужно сделать, это вызвать его с индивидуальным блоком:

-(void)logIt { 

    [self.treeController logWithBlock:^NSString *(NSTreeNode * node) { 

     // This will be called for every node in the tree. This implementation 
     // will see the object's description logged to the console - you may 
     // want to do something more elaborate. 
     NSString *description = [[node representedObject] description]; 
     return description; 
    }]; 

} 

исследующих NSOutlineView сторону

Если все данные, похоже, правильно загружены в NSTreeController, вы можете посмотреть, как ваш NSOutlineView населен. Метод делегата -[NSOutlineViewDelegate outlineView:viewForTableColumn:item] - хорошее место для начала.Аргумент item является экземпляром NSTreeNode, поэтому перед возвратом соответствующего вида вы можете посмотреть на этот узел и убедиться, что он ведет себя как ожидалось. В вашем случае вы должны тщательно изучить свойства объектов item, представляющих объекты CBDisc. (Возможно, вам нужно нажать на кнопки раскрытия информации, чтобы получить этот метод, чтобы огонь для соответствующих объектов.)

-(NSView *)outlineView:(NSOutlineView *)outlineView 
    viewForTableColumn:(NSTableColumn *)tableColumn 
        item:(id)item { 

    NSTreeNode *node = (NSTreeNode *)item; 
    NSManagedObject *representedObject = (NSManagedObject *)node.representedObject; 

    // Query the node 
    NSLog(@"%@ <%@>", representedObject.description, [representedObject class]); 
    NSLog(@" node is a leafNode: %@", node.isLeaf ? @"YES" : @"NO"); 
    NSLog(@" node has child-count of: %lu", (unsigned long)node.childNodes.count); 

    // Query the NSManagedObject 
    // your stuff here... 

    // This is app-specific - you'll probably need to change the identifier. 
    return [outlineView makeViewWithIdentifier:@"StandardTableCellView" owner:self]; 
} 
+0

Спасибо за этот код. Да, источник данных NSTreeCOntroller работает правильно.У меня есть все дети (я добавил к вопросу выход). Но тогда, когда проблема? В NSOutlineView? – aneuryzm

+0

В вашем вопросе, чуть выше выхода журнала, вы должны быть явным, что не отображается в виде схемы, но должно быть - я предполагаю, что это экземпляры '' CBEpisode''. Также был бы очень полезен скриншот '' NSOutlineView''. Наконец, включите некоторую информацию о том, какие методы 'NSOutlineViewDelegate'' вы реализуете. –

+0

Да, CBEpisode отсутствует. – aneuryzm