Включение действий выбора и пользователя строки
Если пользователь не может выбрать строки, отображение списка данных в табличном представлении мало полезно. Используя методы NSTableView
класс, Вы позволяете пользователям выбрать одну или более строк, перетащить для изменения выбора и типа для выбора. Кроме того, можно включить программируемый выбор и вывести на экран контекстное меню, это связано с таблицей.
Получение текущего выбора строки
NSTableView
класс обеспечивает несколько методов для получения информации о в настоящее время выбираемых строках табличного представления: selectedRowIndexes
, selectedRow
, numberOfSelectedRows
, и isRowSelected:
.
selectedRowIndexes
метод обеспечивает полный и корректный выбор, выбран ли единственный элемент, или выбраны многократные элементы. Метод возвращается NSIndexSet
объект, содержащий индексы выбранных строк.
selectedRow
если никакая строка не выбрана, метод возвращает индекс только последней выбранной строки, или-1. Когда множественный выбор отключен, Используя этот метод самый простой способ получить текущий выбор.
numberOfSelectedRows
метод, возвращающий число выбранных строк, может использоваться в качестве ярлыка, чтобы определить, выбраны ли какие-либо объекты, когда разрешен пустой выбор. Его значение может также использоваться, чтобы определить, должны ли элементы интерфейса пользователя быть включены или отключены, если они зависят от многократных элементов, выбираемых в табличном представлении. Например, если numberOfSelectedRows
больше, чем 1, можно отключить части пользовательского интерфейса, которые релевантны только, когда выбран единственный элемент.
isRowSelected:
метод позволяет приложению узнавать, выбрана ли строка в определенном индексе.
Приложения часто должны выполнять итерации по выбранным строкам. Можно реализовать это путем итерации по содержанию выбора, возвращенного selectedRowIndexes
или при помощи NSIndexSet
блочный метод перечисления enumerateIndexesUsingBlock:
. Для получения дополнительной информации об использовании этих методов посмотрите Итерацию Через Индексные Наборы в Наборах, Программируя Темы.
Реакция на изменения в выборе строки
Пользователи могут выбрать многократные строки с помощью клавиши Shift (для непрерывных выборов) или Командная клавиша (для выборов состоящих из нескольких несмежных участков). Для получения дополнительной информации о пользовательских действиях выбора, посмотрите, Делают Ввод данных пользователем Удобным в Инструкциях по Интерфейсу пользователя OS X.
Поскольку пользователь выбирает строки путем перетаскивания (использование сенсорной панели или мыши), методам делегата можно сообщить об изменениях в выборе строки. Делегат получает следующие сообщения, поскольку изменения в выборе происходят пользователем. (Делегаты к табличным представлениям, которыми управляет привязка Какао также, получают эти сообщения и могут действовать на них как требуется.) Приложение может получить эти сообщения на постоянной основе, таким образом, важно создать эффективные внедрения.
selectionShouldChangeInTableView:
Этот метод обычно реализуется, когда необходимо выполнить проверку при редактировании строки прежде, чем позволить выбору строки изменяться.
Например, если пользователь редактирует строку в табличном представлении, и содержание той строки не удовлетворяет требуемые критерии, делегат должен возвратиться
NO
от этого метода, чтобы препятствовать тому, чтобы пользователь изменил выбор. Если действие было отклонено, этот метод ответственен за сообщение пользователям, почему изменение выбора было запрещено и какие меры они могут принять для исправления ситуации. По умолчанию, этот метод возвратыYES
, который позволяет выбору быть измененным.Этот метод сообщает делегату, что выбор строки собирается измениться вследствие взаимодействия с мышью или сенсорной панелью. Клавиатурный набор не вызывает этот метод.
Этот метод сообщает делегату, что выбор строки изменился и что, эффективно, завершается действие выбора табличного представления. Метод отправляется делегату, когда включены разъединения абонентом кнопка мыши, ограничивается ли выбор единственной строкой или множественным выбором.
tableViewSelectionIsChanging:
и tableViewSelectionDidChange:
сообщения являются уведомлениями. Каждый передается NSNotification
объект. Отправка уведомления инстанцирует object
обменивайтесь сообщениями возвращает табличное представление, относящееся к изменению выбора.
Делегат табличного представления может также реализовать tableView:selectionIndexesForProposedSelection:
метод делегата позволить или запретить выбор определенного набора строк в табличном представлении. Метод передается индексы строк, предложенных, чтобы быть выбранными, и он возвращает строки, которые будут фактически выбраны. Реализация этого метода позволяет приложению выборочно позволять и запрещать выбор строки как надлежащий. Например, если пользователь щелкает в области строки таблицы, которая не должна инициировать выбор, этот метод может использоваться, чтобы препятствовать тому, чтобы тот выбор имел место.
Разрешение многократного и пустого выбора
Табличное представление может быть, конфигурируют выбор тремя способами:
Позвольте единственной строке быть выбранной сразу
Позвольте многократным строкам быть выбранными одновременно
Попытка предотвратить там от того, чтобы быть пустым выбором (т.е. по крайней мере одна строка всегда выбирается),
Эти атрибуты могут быть сконфигурированы в Интерфейсном Разработчике или программно.
Программно, методы табличного представления для включения и отключения этих опций установлены с помощью следующих методов: setAllowsMultipleSelection:
и setAllowsEmptySelection:
.
Выбор и отмена выбора строк программно
Выбрать строки программно, NSTableView
класс обеспечивает selectRowIndexes:byExtendingSelection:
метод экземпляра.
selectRowIndexes:byExtendingSelection:
метод ожидает NSIndexSet
содержа индексы (основанные на нуле) из строк, которые будут выбраны, и параметр, указывающий, должен ли быть расширен текущий выбор. Если расширяющийся параметр выбора YES
, указанные индексы строки выбраны в дополнение к любым ранее выбранным строкам; если это NO
, выбор изменяется на недавно указанные строки. Когда этот метод вызывают, делегат получает только tableViewSelectionDidChange:
уведомление.
Для отмены выбора строки передайте индекс строки для отмены выбора к deselectRow:
. Когда этот метод вызывают, делегат получает только tableViewSelectionDidChange:
уведомление.
Существует также два удобных метода, позволяющие выбор и отмену выбора всех элементов в табличном представлении. В целом эти методы подключены к пользовательскому интерфейсу так, чтобы пользователи могли выбрать или отменить выбор всех элементов в таблице. deselectAll:
метод отменяет выбор всех выбранных строк, но только если allowsEmptySelection
возвраты YES
. Точно так же selectAll:
выбирает все строки табличного представления, но только если allowsMultipleSelection
возвраты YES
. В отличие от других программируемых методов, эти два метода вызов selectionShouldChangeInTableView:
на объекте делегата, если реализовано, сопровождаемый tableViewSelectionDidChange:
. Если также deselectAll:
или selectAll:
вызывается без надлежащего allows...
установка, это проигнорировано.
Используя выбор типа для выбора строк
Чтобы упростить навигацию в таблицах или позволить пользователю выбирать элементы с помощью клавиатуры, табличное представление может выбор типа поддержки. Используя выбор типа, пользователь вводит первые несколько букв записи, и содержание табличного представления ищется соответствующую строку. Можно использовать setAllowsTypeSelect:
метод, чтобы включить или отключить выбор типа (по умолчанию, выбор типа включен).
Выбор типа использует метод делегата tableView:typeSelectStringForTableColumn:row:
выяснять который строки соответствовать против. Этот метод делегата возвращает строку, которую выбор типа использует для соответствия.
Когда tableView:typeSelectStringForTableColumn:row:
метод не реализован делегатом, поведение состоит в том, чтобы вызвать preparedCellAtColumn:row:
, передача индекса столбца и строки и затем возврата stringValue
. Это позволяет выбору типа работать над значениями в любом столбце и строкой в табличном представлении. Для ограничения выбора типа определенными частями таблицы возвратиться nil
для столбцов, которые должны быть исключены. Например, следующая реализация метода позволяет выбору типа соответствовать значения только в столбце «имени».
- (NSString *)tableView:(NSTableView *)tableView typeSelectStringForTableColumn:(NSTableColumn *)tableColumn |
row:(NSInteger)row |
{ |
if ([[tableColumn identifier] isEqualToString:@"name"]) |
{ |
NSUInteger tableColumnIndex=[[tableView tableColumns] indexOfObject:tableColumn]; |
return [[tableView preparedCellAtColumn:tableColumnIndex |
row:row] stringValue]; |
} |
return nil; |
} |
Реализация метода делегата tableView:nextTypeSelectMatchFromRow:toRow:forString:
позволяет делегату далее настраивать выбор типа для соответствия только определенного диапазона строк. Этот метод передается текущая строка выбора типа, и это сравнивает надлежащие значения в выбранных строках, возвращая строку для выбора, или-1, если не соответствует никакая строка.
Наконец, tableView:shouldTypeSelectForEvent:withCurrentSearchString:
метод дает делегату опцию позволить или запретить выбор типа для определенного события клавиатуры. Можно реализовать этот метод, чтобы препятствовать тому, чтобы определенные символы вызвали выбор типа. Обратите внимание на то, что возврат NO
от этого метода препятствует тому, чтобы указанное событие использовалось для выбора типа; это не предотвращает стандартную обработку событий. Не использовать tableView:shouldTypeSelectForEvent:withCurrentSearchString:
обработать Ваши собственные сочетания клавиш. Если необходимо обеспечить пользовательскую обработку сочетания клавиш, переопределение keyDown:
вместо этого.
Отображение контекстного меню в таблице
Можно использовать контекстное меню, чтобы предложить пользователям удобный способ получить доступ к маленькому набору команд, действующих на один или несколько элементов в таблице. Например, когда пользовательский Щелчок команды песня, перечисленная в iTunes, контекстное меню появляется, который упрощает (среди прочего) играть, копировать или удалять песню.
Простой способ добавить контекстное меню к таблице состоит в том, чтобы установить menu
выход таблицы к NSMenu
объект. И если Вы хотите настроить контекстное меню, Вы устанавливаете надлежащий объект как делегат меню и реализуете menuWillOpen:
метод для настройки меню, прежде чем это появится.
В методе действия для пункта меню определите, является ли строка таблицы, по которой щелкают, в наборе индексов, возвращенных selectedRowIndexes
. Если это, примените действие ко всем индексам в наборе; иначе, примените действие только к строке, по которой щелкают. Вот удобный метод, проверяющий, что выбранная строка индексирует и возвращает набор индексов, которые должен обработать метод действия:
- (NSIndexSet *)_indexesToProcessForContextMenu { |
NSIndexSet *selectedIndexes = [_tableViewMain selectedRowIndexes]; |
// If the clicked row is in selectedIndexes, then process all selectedIndexes. Otherwise, process only clickedRow. |
if ([_tableViewMain clickedRow] != -1 && ![selectedIndexes containsIndex:[_tableViewMain clickedRow]]) { |
selectedIndexes = [NSIndexSet indexSetWithIndex:[_tableViewMain clickedRow]]; |
} |
return selectedIndexes; |
} |
Видеть пример, использующий _indexesToProcessForContextMenu
метод, загрузите демонстрационный проект TableViewPlayground и посмотрите на mnuRevealInFinderSelected:
метод в ATComplexTableViewController.m
.
Указание, как подпредставления должны реагировать на события
Представления или средства управления в таблице иногда должны реагировать на входящие события. Чтобы определить, должно ли определенное подпредставление получить текущее событие от нажатия мыши, табличное представление вызывает validateProposedFirstResponder:forEvent:
в его реализации hitTest
. При создании подкласса табличного представления можно переопределить validateProposedFirstResponder:forEvent:
указать, какие представления могут стать первым респондентом. Таким образом Вы получаете события от нажатия мыши.
Значение по умолчанию NSTableView
реализация validateProposedFirstResponder:forEvent:
использование следующая логика:
Возвратиться
YES
поскольку весь предложенный первый респондент просматривает, если они не экземпляры или подклассыNSControl
.Определите, является ли предложенный первый респондент
NSControl
экземпляр или подкласс.Если управление
NSButton
объект, возвратитьсяYES
.Если управление не
NSButton
, вызовите управлениеhitTestForEvent:inRect:ofView:
видеть, является ли область хита допускающей отслеживание (т.е.NSCellHitTrackableArea
) или доступная для редактирования текстовая область (т.е.NSCellHitEditableTextArea
), и возврат надлежащее значение. Обратите внимание на то, что, если текстовая область поражена,NSTableView
также задерживает первое действие респондента.