Обеспечение содержания контроллера

Контроллеры требуют, чтобы содержание управляло, и существует много опций для установки этого содержания. Это может быть сделано программно посредством привязки, или автоматически в ответ на действия, сконфигурированные в Интерфейсном Разработчике. Эта статья описывает различные методы установки и изменения содержания контроллера.

Установка содержания контроллера

NSObjectController и его подклассы инициализируются с методом initWithContent:, передача объекта содержания или nil если Вы намереваетесь использовать привязку содержания. Можно явно установить содержание существующего контроллера с помощью setContent: метод. Намного более распространено обеспечить содержание для контроллеров путем установления привязки с одной из их представленной привязки Содержания Контроллера.

NSObjectController представляет единственную привязку для вызванного содержания contentObject. Можно установить привязку от contentObject к любому объекту, который является кодированием значения ключа и наблюдением значения ключа, совместимым для ключей, что Вы намереваетесь иметь контроллер, воздействуют на.

Контроллеры набора представляют дополнительную привязку: contentArray, contentSet, и contentArrayForMultipleSelection.

contentArray привязка связывается с NSArray или объектом, реализующим индексированные методы доступа надлежащего массива. Так же contentSet привязка связывается с объектом NSSet или объектом, реализующим индексированные методы доступа надлежащего набора. Индексируемые образцы средства доступа описаны в Индексируемых Образцах Средства доступа для К - Много Свойств в Значении ключа, Кодирующем Руководство по программированию.

contentArrayForMultipleSelection привязка является специальной привязкой, включенной только после установления contentArray или contentSet привязка. contentArrayForMultipleSelection привязка используется в качестве нейтрализации для содержания контроллера когда contentArray или contentSet привязка возвращает многократный маркер значений. Это позволяет Вам использовать различный объектный и ключевой путь в качестве содержания набора в этих случаях и часто используется при реализации интерфейса стиля основной подробности.

Например, рисунок 1 показывает типичный интерфейс основной подробности. Контроллер массива, обеспечивающий список действий, определяется как главный контроллер, и имена действий выведены на экран в табличном представлении слева. Второй контроллер массива является подробным контроллером и обеспечивает имена элементов, выведенных на экран в табличном представлении справа.

  Основная подробность рисунка 1 взаимодействует через интерфейс с и без contentArrayForMultipleSelection

Подробный контроллер массива 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, связанный с древовидным контроллером, выводят на экран треугольники раскрытия:

Указание класса содержания контроллера

Для контроллера для создания новых объектов содержания автоматически или в ответ на целевые методы действия это должно знать, что надлежащий класс использует.

Контроллеры могут быть сконфигурированы в одном из двух режимов: объектный режим или режим объекта. В объектном режиме класс содержания указан методом 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];