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

时间:2011-11-23 00:00:42

标签: macos cocoa osx-lion nstableview

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

针对基于细胞的NSTableViews描述了多种方法,例如Mimic the artwork column,但这些并不适用于基于视图的表格视图。

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

有人试过这样的事吗?

布局

Groups/sections displayed using spanning rows

2 个答案:

答案 0 :(得分:5)

我能够通过使用两个独立的NSTableView来实现这一点,这些NSTableView的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;
    }
}

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

答案 1 :(得分:0)

你能不能使用NSOutlineView吗?它专门用于分组支持。