Как добавить диапазон строк в NSTableView на основе представления? - PullRequest
5 голосов
/ 23 ноября 2011

Я пытаюсь получить макет таблицы, как показано ниже, работая с NSTableView на основе представлений, которые были введены в Lion.

Было описано несколько подходов для NSTableView на основе ячеек, например Mimicстолбец обложки , но на самом деле это не относится к табличным представлениям на основе представления.

Идея состоит в том, что таблица заполняется массивом объектов в одной (или более) столбцах, охватывающих строки, указывающиечто объекты совместно используют некоторые общие данные.numberOfRowsInTableView: возвращает к общему количеству элементов (19 в случае прикрепленного изображения).

Кто-нибудь пробовал что-то подобное?

Макет

Groups/sections displayed using spanning rows

Ответы [ 2 ]

5 голосов
/ 11 сентября 2012

Я смог сделать это с помощью , используя два отдельных NSTableView, которые синхронизировали прокрутку NSScrollView .Чтобы узнать, как синхронизировать несколько представлений прокрутки (с точным кодом подкласса), прочитайте Руководство по программированию Scroll View для Mac - Синхронизация представлений прокрутки

У меня есть groupTableView, который имеет один столбец и показывает представлениякоторые представляют группу.У меня также есть itemTableView, который имеет столбцы, представляющие элементы группы.Я использую те же методы делегата / источника данных с операторами if-else, чтобы проверить, какой NSTableView используется, и соответственно ответить соответствующим количеством строк, представлением ячеек и т. Д. Кроме того, я реализую следующий метод делегата для настройки таблицы группы.высота строки представления должна быть равна сумме высот строк элементов в группе:

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
    if (tableView == self.groupTableView) {
        NSUInteger firstRowIndexForGroup = ...;
        NSUInteger lastRowIndexForGroup = ...;
        CGFloat groupHeight = 0.0;
        for (NSUInteger currentRowIndex = firstRowIndexForGroup; currentRowIndex <= lastRowIndexForGroup; currentRowIndex++) {
            groupHeight += [self.itemTableView rectOfRow:lastRowIndexForGroup].size.height;
        }
        return groupHeight - [self.itemTableView intercellSpacing].height;
    } else {
        return self.itemTableView.rowHeight;
    }
}

Вы также должны вызывать -noteHeightOfRowsWithIndexesChanged: каждый раз, когда табличному представлению требуется представление группы, поскольку высота изменяется в соответствии сна количество строк в группе.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    if (tableView == self.groupTableView) {
        GroupRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
        // configure view
        [tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndex:row]];
        return view;
    } else {
        ItemRowView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
        // configure view
        return view;
    }
}

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

0 голосов
/ 23 ноября 2011

Не могли бы вы вместо этого использовать NSOutlineView?Он специально разработан для поддержки группирования.

...