我正在尝试使用如下表所示的表布局来处理Lion中引入的基于视图的NSTableViews。

对于基于单元的NSTableView,有多种描述的方法,例如Mimic the artwork column,但是这些实际上不适用于基于视图的表视图。

这个想法是,该表由一系列对象组成,在一个(或多个)列中跨越行,该行表示对象共享一些数据。 numberOfRowsInTableView:返回项目总数(在附带的图像中为19)。

有没有人尝试过这样的事情?

布局

最佳答案

我可以通过使用两个单独的NSTableView来做到这一点,它们的NSScrollView的滚动同步了。要了解如何同步多个滚动视图(使用确切的子类代码),请阅读Scroll View Programming Guide for Mac - Synchronizing Scroll Views

我有一个具有单个列的groupTableView,并显示了代表该组的视图。我也有itemTableView,其中的列表示该组的项目。我将相同的委托/数据源方法与if-else-statements一起使用,以检查正在使用的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;
    }
}


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

08-05 22:42