Работа с выбором контроллера

NSObjectController и его подклассы NSArrayController и отслеживание поддержки NSTreeController в настоящее время выбранного объекта или объектов. Эта статья объясняет, как получить текущий выбор контроллера, изменить текущий выбор и подстроить способы поведения выбора.

Получение в настоящее время Выбранных объектов контроллера

Существует два метода, обычно использующиеся для доступа к объектам, в настоящее время выбирающимся: selection и selectedObjects.

NSObjectController и его подклассы реализуют selection метод. Этот метод возвращает объект прокси, представляющий текущий выбор получателя. Прокси полностью кодирующий значение ключа совместимый.

То, когда Вы запрашиваете, чтобы значение ключа от выбора проксировало его, возвращает значение или маркер выбора. Маркеры заполнителя предоставляют дополнительную информацию о выборе. Существует три маркера заполнителя, определенные в NSPlaceholders неофициальный протокол:

Некоторая привязка, такая как NSTextField value привязка, позвольте Вам заменять маркеры выбора пользовательскими значениями, обрабатывающимися, поскольку заполнитель оценивает средствами управления. Эти заменяющие значения указаны в инспекторе Привязки в Интерфейсном Разработчике. Привязка, установленная программно, может обеспечить значения для NSNoSelectionPlaceholderBindingOption, NSNotApplicablePlaceholderBindingOption, NSNullPlaceholderBindingOption или NSRaisesForNotApplicableKeysBindingOption ключи, определенные в NSKeyValueBindingCreation неофициальный протокол, в словаре опций, передали bind:toObject:withKeyPath:options:. Протокол NSPlaceholders также обеспечивает два метода класса setDefaultPlaceholder:forMarker:withBinding: и defaultPlaceholderForMarker:withBinding: это позволяет Вам обеспечивать заполнителей по умолчанию для указанных маркеров выбора для привязки.

Часто необходимо непосредственно получить доступ к объектам, в настоящее время выбираемым контроллером, а не объектом прокси, возвращенным selection. NSObjectController и его подклассы обеспечивают selectedObjects метод, чтобы позволить Вам делать просто это. Этот метод возвращает массив, содержащий объекты, в настоящее время выбирающиеся получателем. Реализация NSObjectController возвращает массив, содержащий отдельный объект, объект содержания.

Изменение текущего выбора

Контроллеры набора обеспечивают методы, позволяющие Вам изменять текущий выбор путем добавления и удаления объектов или замены выбора полностью.

Все методы, изменяющие выбор контроллера, возвращают булево значение, указывающее, был ли успешно изменен выбор. Это вызвано тем, что попытка изменить выбор может вызвать a commitEditing сообщение, которое будет отправлено, который может перестать работать или быть отклонен, возможно вследствие проверки сбоя значения. Если выбор изменяется успешно, эти методы возврат YES, иначе они возвращаются NO.

Изменение выбора объектом

NSArrayController обеспечивает следующие методы для замены выбора контроллера полностью или добавления и удаления объектов от текущего выбора:

- (BOOL)addSelectedObjects:(NSArray *)objects;
- (BOOL)removeSelectedObjects:(NSArray *)objects;
- (BOOL)setSelectedObjects:(NSArray *)objects;

Все три метода требуют, чтобы Вы передали массив, содержащий объекты как параметр.

Получение и установка выбора индексом

Классы контроллера набора обеспечивают дополнительные методы получить текущий выбор как ряд индексов к объектам в наборе.

NSArrayController обеспечивает следующие методы для получения и установки выбора индексом:

- (unsigned int)selectionIndex;
- (BOOL)setSelectionIndex:(unsigned int)index;
 
- (NSIndexSet *)selectionIndexes;
- (BOOL)setSelectionIndexes:(NSIndexSet *)indexes;
- (BOOL)addSelectionIndexes:(NSIndexSet *)indexes;
- (BOOL)removeSelectionIndexes:(NSIndexSet *)indexes;

selectionIndexes метод возвращает NSIndexSet, указывающий индексы всех выбранных объектов. Удобный метод selectionIndex возвращает индекс первого выбранного объекта как целое без знака.

Можно явно установить выбор контроллера с помощью setSelectionIndexes: метод, передавая NSIndexSet, указывающий индексы элементов, которые должны стать выбором. setSelectionIndex: метод является удобным методом, позволяющим Вам установить выбор в единственный индекс. Если выбор изменяется успешно, эти методы возврат YES.

addSelectionIndexes: метод пытается добавить объекты, указанные в параметре NSIndexSet к текущему выбору. Точно так же removeSelectionIndexes: попытки удалить объекты, указанные индексом в параметре NSIndexSet от выбора. Если выбор изменяется успешно, возврат методов YES.

NSTreeController обрабатывает данные как массив словарей массивов, таким образом, простой индекс выбора не достаточен. Вместо этого NSTreeController использует NSIndexPath для указания расположения объекта в дереве. NSIndexPath указывает «путь» к выбору как серия индексов в массивы, например «1.4.2.3».

NSTreeController обеспечивает следующие методы для получения и установки выбора индексным путем:

-(NSIndexPath *)selectionIndexPath
-(NSArray *)selectionIndexPaths
 
-(BOOL)setSelectionIndexPath:(NSIndexPath *)indexPath
-(BOOL)setSelectionIndexPaths:(NSArray *)indexPaths
 
-(BOOL)addSelectionIndexPaths:(NSArray *)indexPaths
-(BOOL)removeSelectionIndexPaths:(NSArray *)indexPaths

selectionIndexPaths: метод возвращает массив объектов NSIndexPath, представляющих каждый из в настоящее время выбранных объектов. Удобный метод selectionIndexPath возвращает первый выбранный объект как NSIndexPath.

Вы явно устанавливаете текущий выбор с помощью setSelectionIndexPaths: метод, передавая NSArray NSIndexPath возражает как параметр. Удобный метод setSelectionIndexPath: устанавливает выбор в отдельный объект, указанный параметром NSIndexPath.

Методы addSelectionIndexPaths: и removeSelectionIndexPaths: добавьте или удалите объекты в индексных путях, указанных в массиве от выбора. Как с другими методами изменения выбора они возвращают булево значение YES если был успешно изменен выбор.

Установка способов поведения выбора

Контроллеры набора обеспечивают несколько методов, позволяющих Вам подстраивать, как выбор сохраняется контроллером, и как значения возвращаются selection метод.

Избегает пустого выбора

Часто желательно попытаться всегда иметь по крайней мере один элемент в наборе, выбранном после действия, такого как удаление элемента. Это - поведение по умолчанию контроллеров набора.

Можно изменить это поведение с помощью метода setAvoidsEmptySelection: передача NO как параметр. Даже если существуют объекты в содержании, это позволяет контроллеру иметь пустой выбор. Можно запросить текущее поведение с помощью метода avoidsEmptySelection.

Интерфейсный Разработчик позволяет Вам изменять это поведение для контроллера набора путем снятия выделения с флажком «Avoids empty selection» в панели инспектора контроллера.

Выбор объектов на вставку

По умолчанию контроллер набора автоматически выбирает объекты, поскольку они вставляются. В то время как это часто - корректное поведение при вставке многих объектов в набор, это неэффективно и может ухудшить производительность.

Можно выключить это поведение с помощью setSelectsInsertedObjects: метод. Передача YES поскольку параметр заставляет все недавно вставленные объекты быть выбранными. Если NO передается как параметр, текущий выбор неизменен, поскольку вставляются объекты. Метод selectsInsertedObjects возвращает булевскую переменную, указывающую, будут ли выбраны недавно вставленные объекты.

Можно также изменить эти настройки в Интерфейсном Разработчике путем снятия выделения с флажком «Selects inserted objects» в панели инспектора контроллера.

Всегда использование многократный маркер значений

NSMultipleValuesMarker указывает, что больше чем один объект выбран в контроллере, и значения для требуемого ключа не являются тем же. Если значения являются тем же, значение возвращается, а не маркер выбора. В то время как это позволяет редактировать той общей ценности через все выбранные объекты, это может не быть желаемый результат.

Можно вынудить все множественные выборы всегда возвратить NSMultipleValuesMarker с помощью метода setAlwaysUsesMultipleValuesMarker:, передача YES как параметр. Вы запрашиваете состояние этой установки с помощью метода alwaysUsesMultipleValuesMarker.

Эти настройки могут также быть изменены в Интерфейсном Разработчике путем проверки флажка «Always use multiple values marker».

С большими выборами, включая эту опцию может улучшить производительность.

Выбор заповедников

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

  Пример выбора Заповедников рисунка 1

Это поведение может быть отключено путем вызова setPreservesSelection: метод, передавая NO как параметр. Текущее состояние запрашивается с помощью preservesSelection метод, возвращающий булевскую переменную. Можно также изменить эти настройки в Интерфейсном Разработчике путем снятия выделения с опцией «Preserves selection» в инспекторе контроллера.

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

Выбирает все при установке содержания

Существует на параметр привязки, позволяющий, Вы далее управляете по выбору при использовании NSArrayController.

NSSelectsAllWhenSettingContentBindingOption заставляет контроллер массива автоматически выбирать все элементы в массиве когда изменения приложений contentArray, contentSet, contentObject или contentArrayForMultipleSelection значение контроллера.

Рисунок 2  Выбирает все при подавании примера содержания

Рисунок 2 показывает приложение с интерфейсом основной подробности. Подробность NSTableView выводит на экран единственный задействованный выбор «Дэниел». Когда пользователь выбирает элемент «Swim Team» в основном NSTableView, все элементы выбраны автоматически.

Эта опция установлена или в инспекторе Привязки в Интерфейсном Разработчике, или путем установки объекта NSNumber с булевым значением YES как NSSelectsAllWhenSettingContentBindingOption значение в словаре опций передало bind:toObject:withKeyPath:options:.

Опция «Selects All When Setting Content» также полезна при создании инспекторов для интерфейсов основной подробности, позволяющих множественным выборам происходить в основном интерфейсе. Выбор, который должен быть проверен, предопределяется основным контроллером массива. Контроллер массива инспектора связывается с основным контроллером массива selectedObjects привязка, указание опции «Selects All When Setting Content». Это гарантирует, что все элементы в текущем выборе главного контроллера всегда выбираются в инспекторе. В находящемся в NSDocument приложении, подробный контроллер массива contentArray привязка обычно связывается с экземпляром NSApplication с помощью mainWindow.windowController.document.<yourmastercontroller> ключевой путь, заменяя ключом основного контроллера массива финал вводит ключевой путь.