Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在基于视图的NSTableView中添加行范围?_Macos_Cocoa_Osx Lion_Nstableview - Fatal编程技术网

Macos 如何在基于视图的NSTableView中添加行范围?

Macos 如何在基于视图的NSTableView中添加行范围?,macos,cocoa,osx-lion,nstableview,Macos,Cocoa,Osx Lion,Nstableview,我正在尝试使用Lion中引入的基于视图的NStableView来获得如下所示的表布局 例如,针对基于单元格的NStableView描述了多种方法,但这些方法并不真正适用于基于视图的表视图 其思想是,该表由一个对象数组填充,在一个(或多个)跨行的列中,表示对象共享一些公共数据numberOfRowsInTableView:返回项目总数(对于所附图像为19) 有人试过这样的东西吗 布局 您能不能改用NSOutlineView?它是专门为支持分组而设计的。我可以通过使用两个单独的NSTableView

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

例如,针对基于单元格的NStableView描述了多种方法,但这些方法并不真正适用于基于视图的表视图

其思想是,该表由一个对象数组填充,在一个(或多个)跨行的列中,表示对象共享一些公共数据
numberOfRowsInTableView:
返回项目总数(对于所附图像为19)

有人试过这样的东西吗

布局


您能不能改用
NSOutlineView
?它是专门为支持分组而设计的。

我可以通过使用两个单独的NSTableView来实现这一点,这两个NSScrollView的滚动同步。要了解如何同步多个滚动视图(使用确切的子类代码),请阅读

我有一个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;
    }
}

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

但是,如果组值的高度是所有子节点行的总高度,而不是使用它自己的行,那么如何将组值放入单元格中呢?噢,哇……这绝对是一个解决方案,我不会首先想到它!在我看到它是如何工作之前,我已经使用了同步滚动。可能需要添加的一件事是,如果单击/选择组单元格,则必须将选择“转发”到项目表视图的第一行。您还可以将组表视图拆分为每个组可选包含两行,这样可以使顶行浮动在其他行之上,因此,如果您有一个大组,您的组信息会一直浮动,直到最后一个组项目滚动到屏幕外。您想出了什么办法使项目表的行与组表保持同步?您如何防止items表对其行进行排序,使其与旁边的组不对应?@erynofwales我依赖这些组进行排序。项目永远不会作为一个整体进行排序(项目不会保持分组)。将组作为一个整体进行排序,然后对每组的项目进行排序是可以接受的。对组进行更改时,将重新加载两个表视图。我使用一个单独的数据源对象来封装对数据的访问,并公开在表视图的数据源方法中使用的方法,如-indexOfGroup:和-indexOfItem:和-groupAtIndex:和-itemAtIndex:。在内部,数据源对象使用两个数组(一个用于组,一个用于项)以提高速度和简单性。
- (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;
    }
}