Используя древовидные контроллеры с объектами NSXML
NSXMLDocument
объект представляет иерархическую древовидную структуру, составленную из NSXMLNode
объекты. В шаблоне разработки Контроллера представления Модели, NSXMLDocument
объект модели, потому что он представляет данные приложения в формате XML. Это целесообразно тогда что NSXMLDocument
объект был бы идеально соответствующим с целью объект и объект контроллера, разработанные для обработки данных, расположенных в древовидных структурах. С этой целью Какао обеспечивает NSTreeController
класс для уровня контроллера; для выводящих на экран иерархию представлений, существуют NSOutlineView
и NSBrowser
классы.
Следующие разделы обходят Вас через шаги для использования NSTreeController
объект соединился с NSOutlineView
объект в приложении NSXML. Для коммуникации данных между представлением, контроллером и объектами модели, пример использует привязку и не полагается ни на какой источник данных, делегацию или методы действия.
Создание основанного на документе проекта приложения
Примером проекта является приложение, выводящее на экран структуру XML-файла в представлении схемы; когда пользователь выбирает узел в представлении схемы, приложение показывает текстовое содержание того узла (и его дочерние элементы) в текстовом представлении. Рисунок 1 показывает часть представления схемы приложения во время выполнения.
Для этого примера приложение основано на документе — вероятный сценарий для приложения, данные документа которого являются разметкой 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 идентифицирует этот объект контроллера.
С древовидным выбранным контроллером откройте область Attributes окна инспектора (Команда 1). Во-первых, установите значение Поля имени Класса объекта к NSXMLNode
. Это - базовый тип класса объектов, составляющих древовидную структуру.
Область Attributes имеет несколько «ключевых путей» атрибуты, которые являются определенными для NSTreeController
объект. Клавиша Enter соединяет каналом в первом и трети этих текстовых полей:
Путь ключа Children: Введите имя
NSXMLNode
метод, возвращающий дочерние элементы узла (children
).Ключевой путь количества: Введите имя
NSXMLNode
метод, возвращающий число дочерних элементов для данного узла (childCount
). Этот метод более эффективен, чем вызовcount
на дочернем массиве.Листовой ключевой путь: Войти
isLeaf
, имя метода категории Вы реализовали в Добавляющих Методах к NSXMLNode.
Наконец, добавьте к таблице Keys этой области имя другого метода в категории на NSXMLNode
: displayName
. Когда Вы закончены, область Attributes для древовидного контроллера должна быть похожей на тот на рисунке 3.
Как только древовидный контроллер сконфигурирован с соответствующими ключевыми путями объекта модели, можно установить привязку между древовидным контроллером и NSXMLDocument
экземпляр, сохраненный как свойство объекта документа. С NSTreeController
возразите все еще выбранный, откройте область Bindings инспектора (Команда 4). Представьте contentObject свойство и установите значения Связывания Со всплывающим меню и текстовым полем Model Key Path как показано на рисунке 4. Этот шаг делает NSXMLDocument
возразите источнику содержания для древовидного контроллера.
Здесь Связывание Для оценки установлено во Владельца Файла, который является экземпляром NSDocument
подкласс, содержащий NSXMLDocument
возразите как свойство. Также обратите внимание на то, что ключевой путь, вводимый в Ключевое Поле трактов Модели, включает не только theDocument
свойство документа, но rootElement
свойство, соответствующее rootElement
метод NSXMLDocument
. Объект содержания древовидного контроллера должен быть объектом в корне древовидной иерархии, которая для XML-документа является его корневым элементом.
Заключительная часть процедуры требует, чтобы Вы установили привязку между представлением схемы и древовидным контроллером. Откройте область Bindings инспектора и неоднократно щелкайте по вершине представления схемы, пока инспектор не покажет Столбец таблицы. Тогда представьте свойство значения в области Bindings инспектора и установите привязку через древовидный контроллер arrangedObjects
свойство к displayName
атрибут каждого узла в объекте модели ( NSXMLDocument
экземпляр). Установка привязки должна быть похожей на пример на рисунке 5.
Скомпилируйте проект, выполните его и наблюдайте, как представление схемы теперь отражает структуру XML-документа.