0

我的 NSOutlineView 中有两列。一种是文本和图像单元格(类似于 DragNDropOutlineView Apple 示例代码中的类)。旁边是一个名为“XFToggleCell”的自定义 NSCell 子类,用于显示可以打开和关闭的可见性图标(眼球)(就像 Photoshop 一样)。

XFToggleCell 支持鼠标跟踪/拖动(同样,就像 Photoshop 一样),因此您可以单击一个眼球,然后向下拖动以一次显示/隐藏多个项目。在文本和图像单元格中,当项目隐藏时,我将文本显示为灰色,而不是显示为黑色。

几乎一切工作正常。当我单击一个眼球 (XFToggleCell) 时,它的图像会被清除并且我的模型对象会被隐藏。但是,相邻的文本和图像单元格的字体不会变成灰色(它不会更新),直到我再次单击切换单元格......当我这样做时,图像和文本单元格的文本的颜色总是与什么相反它应该是(当点击可见性时,文本变为灰色,反之亦然)。

我确定发生这种情况的原因是因为在更改切换单元格的值之前正在重绘文本和图像单元格。结果,它的显示总是“一键落后”。顺序是这样的:

  1. 我将鼠标放在第 1 列的切换单元格上。
  2. 重绘第 0 列中的文本和图像单元格。
  3. 第 1 列中切换单元的对象值已更改。
  4. 重绘第 1 列中的切换单元格。

如果我可以像上面的步骤 5 那样强制重绘第 0 列中的文本和图像单元格,我应该很高兴。

由于单击第 1 列的单元格,如何强制更新第 0 列的文本和图像单元格的绘图?

这是我认为关键方法的实现......在我的 XFToggleCell.m 中,它位于第 1 列中:

- (BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView
{
    .
    .
    .
    ...do some stuff...
    .
    .
    .
    //Here's where I change the cell's object value, causing the cell to be redrawn.
    //This part works fine.
    [self setObjectValue:([self.representedObject newState]) ? self.image : nil];
    .
    .
    .
    //Why doesn't this next line update the adjacent cell?!?!?!?!?
    //Column 0 contains the text and image cell I'm trying to update
    [controlView setNeedsDisplayInRect:[(NSOutlineView *)controlView frameOfCellAtColumn:0 row:thisRow]];
    }
    return YES;
}
4

1 回答 1

2

好吧,我不太清楚为什么,但打电话

[(NSOutlineView *)controlView setNeedsDisplayInRect:[(NSOutlineView *)controlView frameOfCellAtColumn:col row:row]];

当我把它放在末尾时没有用

-(BOOL)startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView

在我的 XFToggleCell 课程中。

所以我尝试添加

[outlineView setNeedsDisplayInRect:[outlineView frameOfCellAtColumn:col row:row]];

在我的最后

-(void) outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item

我的 NSOutlineView 数据源中的方法,它起作用了。不知道为什么,但这是如何做到的。如果有人能阐明为什么在牢房中调用本质上相同的东西不起作用,我将不胜感激。

于 2012-06-15T01:48:44.213 回答