Обеспечение содержания контроллера
Контроллеры требуют, чтобы содержание управляло, и существует много опций для установки этого содержания. Это может быть сделано программно посредством привязки, или автоматически в ответ на действия, сконфигурированные в Интерфейсном Разработчике. Эта статья описывает различные методы установки и изменения содержания контроллера.
Установка содержания контроллера
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]; |