撤消完全清除视图

时间:2014-03-02 01:53:50

标签: macos quartz-2d undo

我在paint应用程序中实现了一个undo函数。我们的想法是撤消将图层设置为从保存的图层数组中绘制。在将视图添加到绘图之前调用此方法。请注意,layerArray是一个C数组。

-(void)updateLayerUndo
{
CGLayerRef undoLayer = CGLayerCreateWithContext([self.theCanvas viewContext], self.theCanvas.bounds.size, nil);

layerArray[undoCount] = undoLayer;
undoCount += 1;
[[self.undoer prepareWithInvocationTarget:self]performUndoOrRedoWithValueForLayer:layerArray[undoCount - 1]];

}

当用户撤消时,它会自然地调用注册的方法:

-(void)performUndoOrRedoWithValueForLayer:(CGLayerRef)aLayer
{
undoCount -= 1;
self.theCanvas.myLayer = aLayer;
[[NSNotificationCenter defaultCenter]postNotificationName:@"UndoOrRedoPerformed" object:nil];
[self.theCanvas setNeedsDisplay:YES];
}

然后视图执行其绘制方法,它实际上只是在视图的上下文中绘制myLayer。但是,当用户撤消时,视图会完全清除,而不是逐步清除。我觉得我错过了什么,或者我不理解NSUndoManager。哦,我上面展示的方法都在NSDocument子类中,而theCanvas是NSView子类的一个实例。

1 个答案:

答案 0 :(得分:0)

我明白了。我遇到的困惑是我不清楚如何设置重做,所以我误解了文档对撤消管理器和重做的意义。我现在知道要注册重做,我必须注册在管理器撤消时调用的撤消。