CPTreeController (Капучино)

Каков наилучший способ создать источник данных представления структуры, совместимый с привязкой, в капучино? то есть своего рода CPTreeController

мой источник в настоящее время является объектом jSON (содержащим объекты и массивы), и я хотел бы отобразить его в виде схемы, а также иметь возможность изменять его параметры/получать уведомления об изменениях. (После загрузки в CPTreeController мне не нужно сериализовать его обратно в jSON, я буду работать напрямую с источником данных)

Потом:

  • Есть ли где-нибудь скрытый CPTreeController или аналогичная библиотека, готовая к использованию?
  • Если я перепишу свой собственный источник данных, должен ли я написать все с нуля или я могу легко смешать CPDictionaries и CPArrays для выполнения этой задачи? (имея в виду, что он должен быть совместим с привязками)

person Flavien Volken    schedule 30.11.2011    source источник


Ответы (1)


Поиск по источникам показывает, что скрытого CPTreeController нет, поэтому вы можете либо написать свою собственную реализацию CPTreeController и поделиться ею с сообществом, либо реализовать протокол источника данных для конкретной модели, что-то вроде этого:

- (int)outlineView:(CPOutlineView)theOutlineView numberOfChildrenOfItem:(id)theItem
{
    if (theItem == nil)
        theItem = rootNode;

    return [[theItem childNodes] count];
}

- (id)outlineView:(CPOutlineView)theOutlineView child:(int)theIndex ofItem:(id)theItem
{
    if (theItem == nil)
        theItem = rootNode;

    return [[theItem childNodes] objectAtIndex:theIndex];
}

- (BOOL)outlineView:(CPOutlineView)theOutlineView isItemExpandable:(id)theItem
{
    if (theItem == nil)
        theItem = rootNode;

    return [[theItem childNodes] count] > 0;
}

- (id)outlineView:(CPOutlineView)anOutlineView objectValueForTableColumn:(CPTableColumn)theColumn byItem:(id)theItem
{
    return [[theItem representedObject] valueForKey:"name"];
}
person Valerii Hiora    schedule 30.11.2011
comment
Интересно, не будет ли что-то общего с CPTree. Какой объект тогда будет отвечать за привязки клавиш? мой источник данных или объекты, которые я бы добавил в него? - person Flavien Volken; 06.12.2011
comment
CPTreeNode очень помогает, так как вам не нужно заново реализовывать древовидную структуру данных. В приведенном выше примере rootNode и theItem означали CPTreeNodes. Поскольку там, где нет явных привязок, вам решать, какой объект будет отвечать за привязки клавиш, но мне кажется, что CPTreeNode также отделяет древовидную структуру от реальных данных, поэтому лучше привязываться к добавленным объектам, например [[theItem representedObject] valueForKey:"name"]. - person Valerii Hiora; 15.12.2011