Основанный на представлении NSOutlineView Рисование дочерних представлений поверх родительских представлений - PullRequest
0 голосов
/ 08 августа 2011

Использование NSOutlineView + NSTreeController + Core Data приводит к нечетной структуре представления схемы.Как вы можете видеть на изображениях ниже, контурный вид создает пространство для «Дочернего», когда «Родитель» раскрывается, но вместо этого рисует «Дочерний» поверх «Родителя».Я создал кнопку, которая при нажатии вызывает метод [outlineVIew reloadData], который заставляет представление отображаться правильно.

Базовая модель данных:

  • родитель
  • дети
  • isLeaf
  • имя

Моя настройка xib:

  • Для делегата NSOutlineView установлено значение «Владелец файла»
  • NSTreeController привязан к моим документам Контекст основных данных
  • NSTableColumn привязан к NSTreeController.arrangedObjects
  • NSTextField привязан к NSTableCellView.objectValue.name

NSPersistentDocument Class:

- (void)windowControllerDidLoadNib:(NSWindowController *)aController
{
    [super windowControllerDidLoadNib:aController];
    Node *parent = [self createNodeOfTypeString:@"Node"];
    Node *child = [self createNodeOfTypeString:@"Node"];
    parent.name = @"Parent";
    parent.isLeaf = NO;
    [parent addChildrenObject:child];
    child.name = @"Child";
    child.isLeaf = YES;
    [self.treeController addObject:parent];
}

- (id)outlineView:(NSOutlineView *)ov objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {
    return [item representedObject];
}

- (NSView *)outlineView:(NSOutlineView *)ov viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item {
    if ([[item representedObject] isKindOfClass:[Node class]]) {
        // Everything is setup in bindings
        return [ov makeViewWithIdentifier:@"MainCell" owner:self];
    }
    return nil;
}

Результаты:

Наброски со свернутым родителем

Outline View With Parent Collapsed

Схема с расширенным родительским элементом и нарисованным сверху ребенком

Outline View With Parent Expanded and Child Drawn Atop

1 Ответ

0 голосов
/ 10 августа 2011

Это не проблема, связанная с базовыми данными.Это что-то в NSTreeController.Даже если модель данных возвращает неправильные значения, они не должны отображаться друг на друге таким образом.

Контроллер дерева где-то неправильно привязан.Он должен иметь только один верхний узел, отображающий «Родитель».Вместо этого у него есть второй верхний узел с именем «Имя».

...