Я смог сделать это с помощью , используя два отдельных 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;
}
}
Я отключил выбор строк и горизонтальные и вертикальные полосы прокрутки в представлении таблицы группы.Я также сделал горизонтальную сетку сплошной для обоих видов таблицы.Наконец, я размещаю табличное представление группы непосредственно рядом с табличным представлением элемента без промежутка между ними, поэтому кажется, что это просто еще один столбец в одном табличном представлении.Результатом является безупречная реализация, которая имеет нулевой лаг между табличными представлениями.Для пользователя это выглядит так, как будто это одно табличное представление.