3

我正在尝试NSOutlineView使用多行单元格来实现。

根据此站点和其他站点的建议,我在视图的委托中提出了以下代码。

- (CGFloat)outlineView:(NSOutlineView *)outlineView heightOfRowByItem:(id)item {
    NSTableColumn *column = [outlineView outlineTableColumn];
    NSCell *cell = [column dataCell];

    [cell setStringValue:[item valueForKey:@"label"]];

    return [cell cellSizeForBounds:NSMakeRect(0.0, 0.0, [column width], CGFLOAT_MAX)].height;
}

大纲表列中的单元格设置为换行。

然而,我得到了一个奇怪的图形行为——文本行重叠,如http://screencast.com/t/ewJUwRmlGZqh所示。似乎单元格的大小正确,但没有向下推底层单元格。

有人可以帮助我吗?

4

2 回答 2

1

在我的脑海中,我很确定这个委托方法只在重新加载表格单元格的数据时调用,而不是在其他事件(如边界更改)期间调用。

当需要调整行高时,您需要调用重新加载,这将导致表格为每个可见单元格调用此方法,从而执行调整大小。

于 2011-03-24T14:38:33.133 回答
1

(这是作为建议的编辑发布的,但应该是它自己的答案。我不知道这是否有意义。@asavartsov:随时将此答案作为您自己的答案重新发布,并给我留下评论我将删除此副本。)

每当有人要求项目的行高时,该委托就会调用。这种情况尤其发生在因边界变化而导致的绘图操作中。但是,如文档中所述,

NSTableView可能会缓存此方法返回的值,因此如果您想更改行高,请确保通过调用使行高无效noteHeightOfRowsWithIndexesChanged:。自动使其在和NSTableView中的整个行高缓存无效。reloadDatanoteNumberOfRowsChanged

您需要在调整行高时调用noteHeightOfRowsWithIndexesChanged:或调用reload,这将导致表格为每个可见单元格调用此方法,从而执行调整大小。

于 2011-06-24T09:19:35.717 回答