我能够做到这一点使用两个单独的NSTableViews,他们的NSScrollView的滚动同步。要了解如何同步多个滚动视图(具有精确的子类代码),请参阅Scroll View Programming Guide for Mac - Synchronizing Scroll Views
我有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;
}
}
我禁用了行组选择以及组表视图上的水平和垂直滚动条。我还为这两个表格视图制作了水平网格。最后,我将组表视图直接放置在项目表视图的旁边,两者之间没有间隔,因此它看起来好像只是单个表视图中的另一列。结果是在表视图之间没有延迟的完美实现。对用户来说,它看起来好像是单个表格视图。
哦哇......这绝对是一个解决方案,不会让我的第一件事情发生!在我看到它是如何工作之前,我已经使用同步滚动。可能需要添加的一件事是,如果组单元格被点击/选中,则必须将选择“转发”到项目表视图的第一行。 – klotz
您也可以将组表视图向上分组,以便可以选择性地为每个组包含两行,这样您可以使顶部行浮动到其他组上方,因此如果您有一个大组,则组信息会浮动,直到最后一个组项滚动为止屏幕。 – Andrew
你想出什么来保持项目表的行与组表同步?你如何让项目表排序它的行,使它们不与它们旁边的组相对应? – erynofwales