Пример того, как реализовать список источников на основе представления (NSOutlineView) с помощью Cocoa Bindings? - программирование
Подтвердить что ты не робот

Пример того, как реализовать список источников на основе представления (NSOutlineView) с помощью Cocoa Bindings?

Кто-нибудь нашел ясный, краткий пример или руководство о том, как реализовать исходный список, используя NSOutlineView, основанный на представлении, представленный в Lion? Я рассмотрел пример Apple, проект, но без какого-либо чувства направления или объяснения, мне трудно понять концепцию того, как они работают.

Я знаю, как использовать отличный PXSourceList в качестве резервной копии, но мне бы хотелось начать использовать исходные списки на основе списка, если это вообще возможно.

4b9b3361

Ответ 1

Вы отметили это тегом cocoa -bindings, поэтому я предполагаю, что вы имеете в виду "с привязками". Я быстро взвесил пример. Начните с нового нестандартного шаблона приложения Cocoa в Xcode. Назовите это, как хотите. Сначала я добавил некоторый код, чтобы связать некоторые поддельные данные. Вот как выглядит мой заголовок AppDelegate:

#import <Cocoa/Cocoa.h>

@interface SOAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@property (retain) id dataModel;

@end

И вот как выглядит моя реализация AppDelegate:

#import "SOAppDelegate.h"

@implementation SOAppDelegate

@synthesize window = _window;
@synthesize dataModel = _dataModel;

- (void)dealloc
{
    [_dataModel release];
    [super dealloc];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

    // Make some fake data for our source list.
    NSMutableDictionary* item1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 1", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.1", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_2_1 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.1", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item2_2_2 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 2.2.2", @"itemName", [NSMutableArray array], @"children", nil];
    NSMutableDictionary* item3 = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"Item 3", @"itemName", [NSMutableArray array], @"children", nil];

    [[item2_2 objectForKey: @"children"] addObject: item2_2_1];
    [[item2_2 objectForKey: @"children"] addObject: item2_2_2];

    [[item2 objectForKey: @"children"] addObject: item2_1];
    [[item2 objectForKey: @"children"] addObject: item2_2];

    NSMutableArray* dataModel = [NSMutableArray array];

    [dataModel addObject: item1];
    [dataModel addObject: item2];
    [dataModel addObject: item3];

    self.dataModel = dataModel;
}

@end

Нет особого значения для фальшивой структуры данных, которую я создал, я просто хотел показать что-то с несколькими под-уровнями и т.д. Единственное, что имеет значение, это то, что пути ключей, которые вы указываете в привязках в строке Interface Builder с помощью ключей в ваших данных (поддельные данные в этом случае.)

Затем выберите файл MainMenu.xib. В редакторе IB выполните следующие действия:

  • Используйте библиотеку объектов (Ctrl-Cmd-Opt-3), чтобы добавить NSTreeController к вашему .xib.
  • Выберите NSTreeController и с помощью Attributes Inspector (Cmd-Opt-4) установите Пути клавиш > Дети до children (для этого примера; Для ваших данных это должно быть как угодно, массив дочерних объектов.)
  • Когда NSTreeController все еще выбран, используйте инспектор Bindings Inspector (Cmd-Opt-7), чтобы привязать Content Array к AppDelegate с помощью пути ключа модели dataModel
  • Затем используйте библиотеку объектов (Ctrl-Cmd-Opt-3), чтобы добавить NSOutlineView к вашему .xib.
  • Расположите его в соответствии с вашим удовлетворением внутри окна (как правило, всю высоту окна, заподлицо с левой стороны).
  • Выберите NSOutlineView (обратите внимание, что при первом нажатии на него вы, вероятно, выбрали NSScrollView, который его содержит. Нажмите на него второй раз, и вы свернете на сам NSOutlineView. MUCH проще, если вы расширите область слева от редактора IB, где находятся все объекты - это позволяет вам видеть объекты как дерево и перемещаться и выбирать их таким образом.)
  • С помощью Attributes Inspector (Cmd-Opt-4) установите NSOutlineView:
    • Режим содержимого: View Based
    • Столбцы: 1
    • Выделить: Source List
  • Использование Инспектор привязок (Cmd-Opt-7) связывает "Контент" с "Контроллером деревьев", "Ключ контроллера": упорядоченные объекты (здесь поведение NSTableView/NSOutlineViews на основе View начинает отклоняться от NSCell-based)
  • В списке объектов (указанном в # 6) разверните иерархию представлений NSOutlineView и выберите Static Text - Table View Cell.
  • Использование Инспектор привязок (Cmd-Opt-7) привязывает Значение к Table Cell View, путь ключа модели: objectValue.itemName (я использовал itemName в поддельных данных, вы бы хотите использовать тот ключ, который соответствует имени ваших элементов данных)

Сохранить. Запустить. Вы должны увидеть список источников, и как только вы расширите узлы с дочерними элементами, вы можете увидеть что-то вроде этого:

enter image description here

Если вы находитесь в Программе разработчиков Apple, вы можете получить доступ к WWDC 2011 Video. Там специально предназначен для работы с NSTableView (и NSOutlineView) на основе View, и он включает в себя довольно полное покрытие привязок.

Надеюсь, что это поможет!

Ответ 2

Взгляните на этот пример.

SideBarDemo