2011-11-23 72 views
5

我想要获得如下所示的表格布局,使用Lion中引入的基于视图的NSTableViews。如何在基于视图的NSTableView中添加行跨度?

存在针对基于单元的NSTableView所描述的多种方法,例如, Mimic the artwork column,但这些并不适用于基于视图的表格视图。

这个想法是,该表由一个对象数组填充,在一个(或多个)列中生成指示对象共享某些共同数据的列。 numberOfRowsInTableView:返回到项目总数(在附加图像的情况下为19)。

有没有人试过类似的东西?

布局

Groups/sections displayed using spanning rows

回答

5

我能够做到这一点使用两个单独的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; 
    } 
} 

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

+0

哦哇......这绝对是一个解决方案,不会让我的第一件事情发生!在我看到它是如何工作之前,我已经使用同步滚动。可能需要添加的一件事是,如果组单元格被点击/选中,则必须将选择“转发”到项目表视图的第一行。 – klotz

+0

您也可以将组表视图向上分组,以便可以选择性地为每个组包含两行,这样您可以使顶部行浮动到其他组上方,因此如果您有一个大组,则组信息会浮动,直到最后一个组项滚动为止屏幕。 – Andrew

+0

你想出什么来保持项目表的行与组表同步?你如何让项目表排序它的行,使它们不与它们旁边的组相对应? – erynofwales

0

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

+0

但是,如何将组值取入单元格,其高度是所有子节点行的总高度,而不是使用其自己的行? – klotz

相关问题