Используя древовидные контроллеры с объектами NSXML

NSXMLDocument объект представляет иерархическую древовидную структуру, составленную из NSXMLNode объекты. В шаблоне разработки Контроллера представления Модели, NSXMLDocument объект модели, потому что он представляет данные приложения в формате XML. Это целесообразно тогда что NSXMLDocument объект был бы идеально соответствующим с целью объект и объект контроллера, разработанные для обработки данных, расположенных в древовидных структурах. С этой целью Какао обеспечивает NSTreeController класс для уровня контроллера; для выводящих на экран иерархию представлений, существуют NSOutlineView и NSBrowser классы.

Следующие разделы обходят Вас через шаги для использования NSTreeController объект соединился с NSOutlineView объект в приложении NSXML. Для коммуникации данных между представлением, контроллером и объектами модели, пример использует привязку и не полагается ни на какой источник данных, делегацию или методы действия.

Создание основанного на документе проекта приложения

Примером проекта является приложение, выводящее на экран структуру XML-файла в представлении схемы; когда пользователь выбирает узел в представлении схемы, приложение показывает текстовое содержание того узла (и его дочерние элементы) в текстовом представлении. Рисунок 1 показывает часть представления схемы приложения во время выполнения.

  Представление Outline рисунка 1, выводящее на экран данные XML
Outline view displaying XML data

Для этого примера приложение основано на документе — вероятный сценарий для приложения, данные документа которого являются разметкой XML. Важное требование для привязки Какао то, что каждый экземпляр NSDocument подкласс содержит ссылку (как переменная экземпляра) к NSXMLDocument объект, представляющий XML-файл или другой источник. (В терминологии объектного моделирования привязки, NSXMLDocument объект является свойством экземпляра документа.) Экземпляр NSDocument подкласс является Владельцем Файла для файла пера документа, содержащего NSOutlineView возразите и NSTreeController используемый для установления привязки.

Перечисление 1 показывает релевантную часть NSDocument реализация подкласса. В readFromData:ofType:error:, приложение создает NSXMLDocument экземпляр от XML-файла, выбранного пользователем и вызовами метод доступа setTheDocument: присвоить и сохранить переменную экземпляра. Этот метод «метода set» и его дополнительный метод «метода get» не только гарантируют надлежащее управление памятью переменной экземпляра, но и помогают сделать подкласс документа совместимым с требованиями кодирования значения ключа.

Перечисление 1  , Устанавливающее NSXMLDocument, возражает как свойство Владельца Файла

- (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
{
    NSXMLDocument *newDocument = [[NSXMLDocument alloc] initWithData:data
        options:NSXMLNodeOptionsNone error:nil];
    [self setTheDocument:newDocument];
    [newDocument release];
    return YES;
}
 
- (NSXMLDocument *)theDocument
{
    return [[theDocument retain] autorelease];
}
 
- (void)setTheDocument:(NSXMLDocument *)newTheDocument
{
    if (theDocument != newTheDocument)
    {
        [newTheDocument retain];
        [theDocument release];
        theDocument = newTheDocument;
    }
}

Добавление методов к NSXMLNode

Категории являются мощной функцией Objective C. Позволенный Вы добавляете методы к классу, не имея необходимость делать подкласс. Заставить объекты NSXML в нашем примере приложения сотрудничать с NSTreeController объект, необходимо добавить пару методов к NSXMLNode класс через категорию. Перечисление 2 показывает реализацию методов в категории.

В его конфигурации, NSTreeController объект требует некоторого способа знать, является ли какой-либо данный узел в древовидной структуре вершиной — т.е. узел без дочерних элементов. Категория isLeaf метод служит этой цели путем возврата YES если узел является текстовым узлом. Кроме того, каждый узел в представлении схемы должен иметь некоторый текст для представления его. Для элементов (NSXMLElement объекты), тот текст мог быть именем элемента. Однако другие объекты узлов XML, такие как текстовые узлы, не имеют имен, но действительно имеют строковые значения. Таким образом метод необходим для объединения текстового представления, возвращенного для данного узла; метод категории displayName делает это.

Перечисление 2  , Добавляющее категорию к NSXMLNode

@implementation NSXMLNode (NSXMLNodeAdditions)
 
- (NSString *)displayName {
 
    NSString *displayName = [self name];
    if (!displayName) {
        displayName = [self stringValue];
    }
    return displayName;
}
 
- (BOOL)isLeaf {
 
    return [self kind] == NSXMLTextKind ? YES : NO;
}
 
@end

Установление привязки

Для завершения этого приложения в Интерфейсном Разработчике необходимо создать пользовательский интерфейс и установить привязку между древовидным контроллером и NSXMLDocument возразите и представление схемы и древовидный контроллер. Перетащите объект представления схемы от палитры Cocoa-Data и поместите его в окно документа; сделайте его отдельным столбцом, измерьте его и установите любые другие атрибуты, должен был сконфигурировать его. Затем, перетащите объект древовидного контроллера на палитре Cocoa-Controllers в окно файла пера. Рисунок 2 идентифицирует этот объект контроллера.

  Палитра Figure 2 The Cocoa-Controllers
The Cocoa-Controllers palette

С древовидным выбранным контроллером откройте область Attributes окна инспектора (Команда 1). Во-первых, установите значение Поля имени Класса объекта к NSXMLNode. Это - базовый тип класса объектов, составляющих древовидную структуру.

Область Attributes имеет несколько «ключевых путей» атрибуты, которые являются определенными для NSTreeController объект. Клавиша Enter соединяет каналом в первом и трети этих текстовых полей:

Наконец, добавьте к таблице Keys этой области имя другого метода в категории на NSXMLNode: displayName. Когда Вы закончены, область Attributes для древовидного контроллера должна быть похожей на тот на рисунке 3.

Рисунок 3  , Устанавливающий ключи модели
Setting the model keys

Как только древовидный контроллер сконфигурирован с соответствующими ключевыми путями объекта модели, можно установить привязку между древовидным контроллером и NSXMLDocument экземпляр, сохраненный как свойство объекта документа. С NSTreeController возразите все еще выбранный, откройте область Bindings инспектора (Команда 4). Представьте contentObject свойство и установите значения Связывания Со всплывающим меню и текстовым полем Model Key Path как показано на рисунке 4. Этот шаг делает NSXMLDocument возразите источнику содержания для древовидного контроллера.

Рисунок 4  , Устанавливающий объект содержания древовидного контроллера
Setting the tree controller's content object

Здесь Связывание Для оценки установлено во Владельца Файла, который является экземпляром NSDocument подкласс, содержащий NSXMLDocument возразите как свойство. Также обратите внимание на то, что ключевой путь, вводимый в Ключевое Поле трактов Модели, включает не только theDocument свойство документа, но rootElement свойство, соответствующее rootElement метод NSXMLDocument. Объект содержания древовидного контроллера должен быть объектом в корне древовидной иерархии, которая для XML-документа является его корневым элементом.

Заключительная часть процедуры требует, чтобы Вы установили привязку между представлением схемы и древовидным контроллером. Откройте область Bindings инспектора и неоднократно щелкайте по вершине представления схемы, пока инспектор не покажет Столбец таблицы. Тогда представьте свойство значения в области Bindings инспектора и установите привязку через древовидный контроллер arrangedObjects свойство к displayName атрибут каждого узла в объекте модели ( NSXMLDocument экземпляр). Установка привязки должна быть похожей на пример на рисунке 5.

Рисунок 5  , Устанавливающий выведенное на экран значение для элементов в представлении схемы
Setting the displayed value for items in the outline view

Скомпилируйте проект, выполните его и наблюдайте, как представление схемы теперь отражает структуру XML-документа.