2010-11-11 2 views
1

В моем приложении у меня есть NSOutlineView, который получает свои данные из NSTreeController, который, в свою очередь, получает его от модели Core Data.NSOutlineView - объединение нескольких источников

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

Ваша помощь очень ценится. Я чувствую, что мне не хватает чего-то очевидного здесь ...

ответ

4

Что вы будете здесь делать, это написать пользовательский NSTreeController подкласс. Вот почему это идеальное место для изменений, которые вы хотите сделать:

  • Это не в модели, как вы сказали.
  • Не имеет никакого отношения к виду - полностью прозрачный.
  • В принципе, вы хотите создать отображаемые данные из сохраненных данных. < - это задача контроллера.

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

- (id)arrangedObjects { 
    id root = [super arrangedObjects]; 

    // "root" is something like a NSTreeNode but not quite yet 
    NSTreeNode *newRoot = [NSTreeNode treeNodeWithRepresentedObject: nil]; 
    [[newRoot mutableChildNodes] setArray: [root childNodes]]; 

    // Do your customizations here 

    return newRoot; 
} 

Возвращаемый объект класса NSTreeNode - смотрите в документации о том, как делать изменения.

+0

Не могу поверить, что раньше не рассматривал этот подход. Одна коррекция: '-arrangedObjects' не возвращает объект класса NSTreeNode', а объект, который обрабатывает сообщения' -childNodes' и '-descendantNodeAtIndexPath:'. Кроме того, может оказаться лучше переопределить '-rearrangeObjects' и выполнить свою работу там. –

+0

Спасибо, это похоже на шаг в правильном направлении. Но NSTreeController ужасно непрозрачен и, как писал Майк, возвращает только объекты bizarro _NSTreeProxy, которые не получены из NSTreeNode. И это означает, что я не могу использовать mutableChildNodes, поэтому я все еще исследую это. –

+0

Хорошо. Затем просто используйте метод '-childNodes' для получения узлов, создайте отдельный« NSTreeNode »и верните его! (Я отрегулирую ответ за секунду). –