如何在基于视图的NSTableView中添加行跨?

klo*_*otz 5 macos cocoa nstableview osx-lion

我正在尝试使用Lion中引入的基于视图的NSTableView来获得如下所示的表格布局.

针对基于单元格的NSTableViews描述了多种方法,例如模仿艺术作品列,但这些方法并不真正适用于基于视图的表格视图.

这个想法是表格由一个对象数组填充,在一个(或多个)列中跨越行,表明对象共享一些共同的数据.numberOfRowsInTableView:返回项目总数(附加图像为19).

有没有人尝试过这样的东西?

布局

使用跨越行显示的组/部分

And*_*rew 5

我能够通过使用两个单独的NSTableView来实现这一点,这些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;
    }
}
Run Code Online (Sandbox Code Playgroud)

-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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在组表视图上禁用了行选择以及水平和垂直滚动条.我还为两个表视图设置了水平网格.最后,我将组表视图直接放在项表视图旁边,两者之间没有间隙,因此它看起来好像只是单个表视图中的另一列.结果是一个完美的实现,在表视图之间没有任何延迟.对于用户来说,它看起来好像是一个表视图.