Пример того, как реализовать список источников на основе представления (NSOutlineView), используя привязки какао? - PullRequest
17 голосов
/ 11 ноября 2011

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

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

Ответы [ 2 ]

30 голосов
/ 06 января 2012

Вы пометили это тегом привязки какао, поэтому я предполагаю, что вы имеете в виду «с привязками».Я быстро привел пример.Начните с нового не основанного на документе шаблона Приложения Какао в 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

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

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

  1. Используйте библиотеку объектов (Ctrl-Cmd-Opt-3), чтобы добавить NSTreeController к вашему .xib.
  2. ВыберитеNSTreeController и с помощью Инспектора атрибутов (Cmd-Opt-4) установите Ключевые пути> Дети в children (для этого примера; для ваших данных это должно быть то, что возвращает массив дочерних объектов.)
  3. Когда NSTreeController все еще выбран, используйте Инспектор привязок (Cmd-Opt-7), чтобы связать массив содержимого с AppDelegate, с ключом модели ключа dataModel
  4. Затем используйте библиотеку объектов (Ctrl-Cmd-Opt-3), чтобы добавить NSOutlineView к вашему .xib.
  5. Расположите его так, как вам удобно внутри окна (обычно на всю высоту окна,вровень с левой стороной)
  6. Выберите NSOutlineView (обратите внимание, что при первом нажатии на него вы, вероятно, выбрали NSScrollView, в котором он содержится. Нажмите на него во второй раз, и вы просверлиливниз в НСОуСам tlineView.Обратите внимание, что это НАМНОГО проще, если вы расширяете область слева от редактора IB, где находятся все объекты - это позволяет вам видеть объекты в виде дерева, а также перемещаться и выбирать их таким образом.)
  7. С помощью Инспектора атрибутов (Cmd-Opt-4) установите NSOutlineView:
    • Режим содержимого : View Based
    • Столбцы : 1
    • Выделение : Source List
  8. Использование инспектора привязок (Cmd-Opt-7) связать «Содержимое»в «Tree Controller», ключ контроллера: layoutObjects (здесь поведение NSTableView / NSOutlineViews на основе вида начинает отличаться от NSCell)
  9. В списке объектов (указан в # 6) развернитепросмотрите иерархию NSOutlineView и выберите Static Text - Table View Cell.
  10. С помощью Инспектора привязок (Cmd-Opt-7) связать Значение до Table Cell View, Путь к ключу модели: objectValue.itemName (Я использовал itemName в фальшивых данных, вы бы хотели использовать любой ключ, соответствующий названию ваших элементов данных)

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

enter image description here

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

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

5 голосов
/ 01 апреля 2013

Посмотрите на этот пример.

SideBarDemo

...