Включение действий выбора и пользователя строки

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

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

NSTableView класс обеспечивает несколько методов для получения информации о в настоящее время выбираемых строках табличного представления: selectedRowIndexes, selectedRow, numberOfSelectedRows, и isRowSelected:.

selectedRowIndexes метод обеспечивает полный и корректный выбор, выбран ли единственный элемент, или выбраны многократные элементы. Метод возвращается NSIndexSet объект, содержащий индексы выбранных строк.

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

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

isRowSelected: метод позволяет приложению узнавать, выбрана ли строка в определенном индексе.

Приложения часто должны выполнять итерации по выбранным строкам. Можно реализовать это путем итерации по содержанию выбора, возвращенного selectedRowIndexes или при помощи NSIndexSet блочный метод перечисления enumerateIndexesUsingBlock:. Для получения дополнительной информации об использовании этих методов посмотрите Итерацию Через Индексные Наборы в Наборах, Программируя Темы.

Реакция на изменения в выборе строки

Пользователи могут выбрать многократные строки с помощью клавиши Shift (для непрерывных выборов) или Командная клавиша (для выборов состоящих из нескольких несмежных участков). Для получения дополнительной информации о пользовательских действиях выбора, посмотрите, Делают Ввод данных пользователем Удобным в Инструкциях по Интерфейсу пользователя OS X.

Поскольку пользователь выбирает строки путем перетаскивания (использование сенсорной панели или мыши), методам делегата можно сообщить об изменениях в выборе строки. Делегат получает следующие сообщения, поскольку изменения в выборе происходят пользователем. (Делегаты к табличным представлениям, которыми управляет привязка Какао также, получают эти сообщения и могут действовать на них как требуется.) Приложение может получить эти сообщения на постоянной основе, таким образом, важно создать эффективные внедрения.

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: использование следующая логика:

  1. Возвратиться YES поскольку весь предложенный первый респондент просматривает, если они не экземпляры или подклассы NSControl.

  2. Определите, является ли предложенный первый респондент NSControl экземпляр или подкласс.

    • Если управление NSButton объект, возвратиться YES.

    • Если управление не NSButton, вызовите управление hitTestForEvent:inRect:ofView: видеть, является ли область хита допускающей отслеживание (т.е. NSCellHitTrackableArea) или доступная для редактирования текстовая область (т.е. NSCellHitEditableTextArea), и возврат надлежащее значение. Обратите внимание на то, что, если текстовая область поражена, NSTableView также задерживает первое действие респондента.