Обеспечение содержания контроллера
Контроллеры требуют, чтобы содержание управляло, и существует много опций для установки этого содержания. Это может быть сделано программно посредством привязки, или автоматически в ответ на действия, сконфигурированные в Интерфейсном Разработчике. Эта статья описывает различные методы установки и изменения содержания контроллера.
Установка содержания контроллера
NSObjectController и его подклассы инициализируются с методом initWithContent:, передача объекта содержания или nil если Вы намереваетесь использовать привязку содержания. Можно явно установить содержание существующего контроллера с помощью setContent: метод. Намного более распространено обеспечить содержание для контроллеров путем установления привязки с одной из их представленной привязки Содержания Контроллера.
NSObjectController представляет единственную привязку для вызванного содержания contentObject. Можно установить привязку от contentObject к любому объекту, который является кодированием значения ключа и наблюдением значения ключа, совместимым для ключей, что Вы намереваетесь иметь контроллер, воздействуют на.
Контроллеры набора представляют дополнительную привязку: contentArray, contentSet, и contentArrayForMultipleSelection.
contentArray привязка связывается с NSArray или объектом, реализующим индексированные методы доступа надлежащего массива. Так же contentSet привязка связывается с объектом NSSet или объектом, реализующим индексированные методы доступа надлежащего набора. Индексируемые образцы средства доступа описаны в Индексируемых Образцах Средства доступа для К - Много Свойств в Значении ключа, Кодирующем Руководство по программированию.
contentArrayForMultipleSelection привязка является специальной привязкой, включенной только после установления contentArray или contentSet привязка. contentArrayForMultipleSelection привязка используется в качестве нейтрализации для содержания контроллера когда contentArray или contentSet привязка возвращает многократный маркер значений. Это позволяет Вам использовать различный объектный и ключевой путь в качестве содержания набора в этих случаях и часто используется при реализации интерфейса стиля основной подробности.
Например, рисунок 1 показывает типичный интерфейс основной подробности. Контроллер массива, обеспечивающий список действий, определяется как главный контроллер, и имена действий выведены на экран в табличном представлении слева. Второй контроллер массива является подробным контроллером и обеспечивает имена элементов, выведенных на экран в табличном представлении справа.


Подробный контроллер массива contentArray привязка связывается с основным объектом контроллера массива с ключевым путем selection.members. value привязка столбца в подробном табличном представлении связывается с подробным контроллером массива arrangedObjects.name ключевой путь. Когда единственное действие выбрано в основном табличном представлении, подробное табличное представление выводит на экран имена к - много задействованных отношений.
Если основное табличное представление сконфигурировано для разрешения множественного выбора, Однако, что происходит? Если только подробный контроллер массива contentArray связывается, подробное табличное представление пусто. В то время как это логично, это - не обязательно желаемые результаты. Лучшая опция могла бы состоять в том, чтобы вывести на экран уникальный список элементов в выбранных действиях. Это то, где contentArrayForMultipleSelection привязка и значение ключа, кодирующее операторов набора, играет роль.
Путем установления привязки от contentArrayForMultipleSelection к основному контроллеру массива с помощью ключевого пути selection.@distinctUnionOfArrays.members, подробное табличное представление будет заполнено с именами пользователей во всех выбранных действиях. Поскольку @distinctUnionOfArrays оператор использовался, элементы, которые характерны для обоих действий, не появляются как двойные названия в подробном табличном представлении.
Обратите внимание на то, что, когда основной контроллер массива имеет множественный выбор, подробный контроллер массива добавляет и удаляет кнопки, отключены. Кнопки enabled привязка связывается с подробным контроллером массива canAdd и canRemove методы. Подробный контроллер массива автоматически знает, что это неспособно добавить и удалить элементы к составной антенной решетке и обновляет canAdd и canRemove состояние, заставляя кнопки быть отключенным.
Пересечение древовидного содержания с NSTreeController
NSTreeController требует, чтобы Вы описали, как он должен пересечь дерево объектов путем указания дочернего ключевого пути. Этот ключевой путь может быть установлен программно с помощью метода NSTreeController setChildrenKeyPath: или указанный в панели инспектора древовидного контроллера в Интерфейсном Разработчике.
Все дочерние объекты для дерева должны быть кодированием значения ключа, совместимым для того же дочернего ключевого пути. Если необходимый необходимо реализовать методы доступа в классах модели или категории на тех классах, та карта дочерний ключ к надлежащему специфичному для класса имени метода.
Дополнительный ключевой путь количества может быть указан, который, если предоставленный, возвращает число доступных дочерних объектов. Ключевой путь количества установлен программно с помощью setCountKeyPath: метод, или в панели инспектора контроллера в Интерфейсном Разработчике. Ваши объекты модели, как ожидают, обновят значение ключевого пути количества в наблюдающем значение ключа совместимом методе.
Можно дополнительно обеспечить листовой ключевой путь, указывающий ключ возвращающемся объекте модели YES если объект является вершиной, и NO если это не. Обеспечение этого ключевого пути препятствует тому, чтобы NSTreeController имел, чтобы определить, является ли дочерний объект вершиной путем исследования дочернего объекта, и в результате улучшите производительность. Листовой ключевой путь установлен программно с помощью setLeafKeyPath: метод, или в панели инспектора контроллера в Интерфейсном Разработчике. Этот ключевой путь влияет, как NSOutlineView или NSBrowser, связанный с древовидным контроллером, выводят на экран треугольники раскрытия:
Если листовой ключевой путь для возвратов объекта модели
YES, представление схемы или браузер не показывают треугольник раскрытия.Если листовой ключевой путь для возвратов объекта модели
NO, тогда это всегда показывает треугольник раскрытия.Если никакой листовой ключевой путь не сконфигурирован для контроллера, то количество или дочерний ключевой путь модели запрашиваются для определения, сколько дочерних объектов присутствует. Если существует 0 дочерних объектов, треугольник раскрытия не выведен на экран, иначе это.
Указание класса содержания контроллера
Для контроллера для создания новых объектов содержания автоматически или в ответ на целевые методы действия это должно знать, что надлежащий класс использует.
Контроллеры могут быть сконфигурированы в одном из двух режимов: объектный режим или режим объекта. В объектном режиме класс содержания указан методом setObjectClass: или в инспекторе контроллера панель в Интерфейсном Разработчике. Если контроллер сконфигурирован в режиме объекта, класс определяется именем объекта или отношением, которое объект определяет для ключа. Имя объекта определяется с помощью setEntityName: или в инспекторе контроллера панель в Интерфейсном Разработчике.
Если контроллер находится в объектном режиме, методе newObject используется для создания новых объектов. Реализация по умолчанию просто выделяет новый объект класса, указанного objectClass или entityName и отправляет объекту стандарт init сообщение без параметров. Если Ваши объекты содержания требуют более сложной инициализации, можно разделить надлежащий класс контроллера на подклассы и переопределить newObject метод.
NSObjectController ожидает, что объект содержания будет класса, указанного именем объекта или классом объекта. При использовании NSArrayController и NSTreeController класс объекта относится к отдельным объектам содержания, а не набору, содержащему объекты. В обоих случаях наборы, как ожидают, будут кодированием значения ключа, совместимым с массивами или наборами, в зависимости от привязки, обеспечивающей содержание для контроллера.
Вы не ограничиваетесь наличием содержания класса отдельного объекта. Можно создать и вставить объекты любого класса с помощью одного из программируемых методов обработки, обсужденных в Программно Изменении Содержания Контроллера.
Автоматически подготавливает содержание
NSObjectController и его классы предоставляют поддержку для того, чтобы автоматически создать содержание для контроллера, когда это загружается из файла пера. Это обычно конфигурируется в инспекторе контроллера в Интерфейсном Разработчике путем включения опции «Automatically Prepares Content». Когда эта опция включена, контроллер создает и заполняет объект содержания или набор содержания, когда контроллер загружается из файла пера путем вызова контроллера prepareContent метод.
Например, когда NSObjectController, имеющий класс объекта NSMutableDictionary, загружается из пера и автоматически подготавливается, содержание выбрано, содержание объектного контроллера будет установлено в недавно инстанцированный, пустой экземпляр NSMutableDictionary.
Точно так же, если NSArrayController, имеющий класс объекта Действия, загружается, содержание установлено в недавно инстанцированный NSMutableArray, содержащий единственный экземпляр Действия. NSTreeController действует одинаково.
Если загружающийся контроллер находится в режиме объекта, то данные, соответствующие имени объекта, выбираются и отфильтрованы с помощью сконфигурированного предиката фильтра контроллера.
Программно изменяя содержание контроллера
При изменении объекта содержания контроллера, единственное ограничение - то, что необходимо сделать это наблюдающим значение ключа совместимым способом так, чтобы контроллеру сообщили об изменениях. NSObjectController и его подклассы обеспечивают много методов, позволяющих Вам изменять содержание контроллера программно.
NSObjectController предлагает addObject: и removeObject: методы. Когда используется с NSObjectController, они синонимичны с setContent: метод, передавая объект параметра или nil соответственно.
addObject: и removeObject: методы имеют несколько различное поведение для NSArrayController. В этом случае их поведение совпадает с NSArray's addObject: и removeObject: методы. В отличие от реализаций NSARRAY, эти методы сообщают контроллеру массива изменений так, чтобы они могли быть отражены в пользовательском интерфейсе.
NSArrayController расширяется, основные добавляют и удаляют функциональность со следующими методами:
- (void)addObjects:(NSArray *)objects; |
- (void)removeObjects:(NSArray *)objects; |
- (void)removeObjectsAtArrangedObjectIndexes:(NSIndexSet *)indexes; |
- (void)removeObjectAtArrangedObjectIndex:(unsigned int)index; |
- (void)insertObjects:(NSArray *)objects atArrangedObjectIndexes:(NSIndexSet *)indexes; |
- (void)insertObject:(id)object atArrangedObjectIndex:(unsigned int)index; |
addObjects: и removeObjects: методы добавляют или удаляют объекты, переданные как параметры от набора. Метод removeObjectsAtArrangedObjectIndexes: метод выполняет итерации через переданные индексы, удаляя каждый объект из набора. Метод removeObjectAtArrangedObjectIndex: удаляет отдельный объект в указанном индексе.
insertObjects:atArrangedObjectIndexes: выполняет итерации через массив объектов, переданных как первый параметр, вставляя каждый объект в расположенный набор в соответствующем индексе в NSIndexSet. Точно так же insertObject:atArrangedObjectIndex: метод вставляет отдельный объект, указанный как первый параметр в набор в указанном индексе.
NSTreeController обеспечивает четыре дополнительных метода, работающие подобным способом, но использующие NSIndexPaths для указания расположения в наборе, а не простых индексах:
-(void)removeObjectsAtArrangedObjectIndexPaths:(NSArray *)indexPaths; |
-(void)removeObjectAtArrangedObjectIndexPath:(NSIndexPath *)indexPath; |
-(void)insertObject:(id)object atArrangedObjectIndexPath:(NSIndexPath *)indexPath; |
-(void)insertObjects:(NSArray *)objects atArrangedObjectIndexPaths:(NSArray *)indexPath; |
Изменение содержания контроллера действием Target
В дополнение к программируемому добавляют, вставляют и удаляют методы, классы контроллера реализуют несколько целевых методов действия для изменения содержания контроллера. Эти методы обычно конфигурируются как действия для кнопок в Интерфейсном Разработчике.
NSObjectController обеспечивает следующие целевые методы действия:
- (void)add:(id)sender; |
- (void)remove:(id)sender; |
add: метод создает новый объект содержания с помощью контроллера newObject метод и наборы это как объект содержания контроллера, если в настоящее время нет никакого содержания. remove: метод устанавливает объект содержания в nil.
NSArrayController переопределяет NSObjectController add: и remove: методы и добавляют следующий метод:
- (void)insert:(id)sender; |
С контроллером массива add: создает новый объект с помощью контроллера newObject метод и добавляет его к набору содержания контроллера. remove: метод удаляет в настоящее время выбранные объекты в контроллере массива от набора. insert: метод создает новый объект с помощью контроллера newObject метод, и вставляет его после текущего выбора.
Когда контроллер находится в режиме объекта, удалить семантика зависит от конфигурации привязки и на определении объектов отношения. Удалять может привести к текущему выбору, удаляемому из отношения или удаляемому из графа объектов полностью.
NSTreeController добавляет следующие методы:
- (void)addChild:(id)sender; |
- (void)insertChild:(id)sender; |
addChild: метод создает и вставляет новый объект в конце набора древовидного контроллера. insertChild: метод вставляет новый дочерний объект относительно текущего выбора.
Снова, если контроллер находится в режиме объекта, семантика немного отличаются. add: и insert: действия используют newObject метод для создания объекта, добавляющегося к набору. В объектном режиме addChild:, и insertChild: создайте объекты класса, указанного objectClass, но не используйте newObject метод, чтобы сделать так. В режиме объекта или если родительский объект является подклассом управляемого объекта, объект определяет класс объекта, создаваемого для и newObject никогда не вызывается.
Чтобы включить и отключить целевые кнопки действий как надлежащие, объектные классы контроллера обеспечивают несколько методов, возвращающих булевы значения, указывающие, какие действия в настоящее время возможны, принимая во внимание текущий выбор и конфигурацию контроллера.
//NSObjectController |
- (BOOL)canAdd; |
- (BOOL)canRemove; |
- (BOOL)isEditable; |
//NSArrayController |
- (BOOL)canInsert; |
//NSTreeController |
- (BOOL)canAddChild; |
- (BOOL)canInsertChild; |
Включенная привязка средств управления обычно связывается с контроллером с помощью одного из этих методов. Когда выбор контроллера изменяется, значения, возвращенные этими методами, обновляются, и связанные элементы интерфейса пользователя автоматически включены или отключены как надлежащие.
Разъединение Контроллера от его Привязки Содержания
Чтобы программно разъединить контроллер от объекта содержания, связывающегося с contentObject, contentArray или contentSet, необходимо повредить обязательное соединение и установить содержание контроллера в nil.
[theController unbind:@"contentArray"]; |
[theController setContent:nil]; |