NSTableView: выбор нередактируемых ячеек, а не строк

Я пробовал множество комбинаций предложенных вариантов из других сообщений, но я не могу получить NSTableView на основе ячеек, заполненный нередактируемым NSTextFieldCell, чтобы выбрать ЯЧЕЙКУ, а не строку.

Я пробовал:

    [[col dataCell] setEditable:NO];
    [[col dataCell] setSelectable:YES];

    [col setEditable:YES];

и попробовал делегатов:

- (BOOL)tableView:(NSTableView *)aTableView shouldSelectRow:(NSInteger)rowIndex;

и

- (BOOL)shouldFocusCell:(NSCell *)cell atColumn:(NSInteger)column row:(NSInteger)row;

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

Единственный способ сделать это, чтобы заставить ячейку рисовать свой фон в цвете выделения выделения? (кажется хакерским).

Кстати, выбор COLUMN также разрешен. Это в настоящее время работает.

У кого-нибудь есть опыт решения этой проблемы? Или какие-то мудрые догадки?

Стивен


person SMGreenfield    schedule 27.12.2013    source источник


Ответы (1)


Похоже, вы пытаетесь создать электронную таблицу. Это не то, что представляет собой табличное представление.

Табличное представление — это список элементов, по одному на строку, показывающий один или несколько аспектов каждого элемента, по одному на столбец.

В этом контексте редко имеет смысл выбирать, но не редактировать только одно свойство одного элемента. Для этого могут быть варианты использования (например, может быть удобно, чтобы иметь возможность выбирать и копировать только название дорожки в iTunes), но это не то, что могут приспособить NSTableView и NSOutlineView.

Электронная таблица — это нечто совсем другое. Каждая клетка равна любой другой; ни одна ось не обязательно подчинена другой. Электронная таблица может использоваться как таблица (например, товар, цена, количество, промежуточный итог), но не привязана к парадигме свойств товаров NSTableView.

API NSTableView подтверждает это. Обратите внимание, что в представлении таблицы есть selectedRowIndexes и selectedColumnIndexes, но нет способа перечислить пары столбцов и строк, которые идентифицировали бы выбранные отдельные ячейки.

Лучше всего реализовать собственное представление. Вы, вероятно, преуспеете, если эмулируете протокол источника данных NSTableView — у вас может быть, например, spreadsheetView:objectValueForColumnIndex:rowIndex: — но в противном случае вам предстоит много работы, особенно для реализации редактирования.

Однако в долгосрочной перспективе это лучший и единственный способ добиться индивидуальной клеточной селекции.

person Peter Hosey    schedule 27.12.2013
comment
ну, я не ДУМАЛ, что пытался это сделать (хотя однажды я разработал и запрограммировал выдающийся программный инструмент для составления бюджета кинофильма - и он БЫЛ похож на электронную таблицу). Я ВИДЕЛ NSTableView, где табуляция по ячейкам ВЫБИРАЕТ всю ячейку, а затем нажатие возврата переходит в режим редактирования. Поэтому я подумал, что это можно сделать из коробки. Но ты меня убедил. Лучшим интерфейсом было бы динамическое отображение значка стрелки, когда мышь находится над ячейкой. iTunes делает такие вещи. Есть ли для этого клеточный метод? Или, может быть, подкласс? - person SMGreenfield; 28.12.2013
comment
@SMGreenfield: наведение мыши обрабатывается путем отслеживания областей в представлении, поэтому для этого вам придется создать подкласс NSTableView. Предположительно, вам нужна одна область отслеживания входа и выхода над каждой ячейкой (это означает, что вам нужно будет аннулировать ваши области отслеживания, когда строки приходят и уходят, столбцы переупорядочиваются, размер столбцов изменяется и т. д.) - person Peter Hosey; 28.12.2013
comment
Спасибо - ваше предложение было бы точным способом работы с представлениями таблиц на основе ячеек (поэтому я отмечаю ваш ответ как принятый). Однако я думаю, что подожду, чтобы использовать табличные представления на основе представлений (с минимальной целью 10,7). Кажется намного проще. HoverTableDemo, разработчик Apple, демонстрирует этот метод. - person SMGreenfield; 31.12.2013