当另一个NSCell发生变化时刷新NSCell

时间:2012-06-14 01:35:09

标签: nsoutlineview nscell

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

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

几乎一切都运转良好。当我点击一个眼球(XFToggleCell)时,它的图像会清除,我的模型对象会被隐藏。但是,在我再次单击切换单元格之前,相邻的文本和图像单元格的字体不会变为灰色(它不会更新)...当我这样做时,图像和文本单元格文本的着色始终与它应该是(当点击可见性时,文本变为灰色,反之亦然)。

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

  1. 我在第1列的切换单元格中徘徊。
  2. 重绘第0列中的文本和图像单元格。
  3. 第1列中切换单元格的对象值已更改。
  4. 重绘第1列中的切换单元格。
  5. 如果我可以强制重新绘制第0列中的文本和图像单元格,如上面的第5步那样,我应该很高兴。

    如何通过单击第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;
    }
    

1 个答案:

答案 0 :(得分: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数据源中的

方法很有效。不知道为什么,但这是怎么做的。如果有人能够解释为什么它不能在单元格中调用基本相同的东西,我会很感激信息。