Ответ 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
в поддельных данных, вы бы хотите использовать тот ключ, который соответствует имени ваших элементов данных)
Сохранить. Запустить. Вы должны увидеть список источников, и как только вы расширите узлы с дочерними элементами, вы можете увидеть что-то вроде этого:
Если вы находитесь в Программе разработчиков Apple, вы можете получить доступ к WWDC 2011 Video. Там специально предназначен для работы с NSTableView (и NSOutlineView) на основе View, и он включает в себя довольно полное покрытие привязок.
Надеюсь, что это поможет!