2014-03-02 36 views
0

我在我的绘画应用程序中实现了撤消功能。这个想法是,撤消设置图层从保存的图层数组中绘制。在视图添加到绘图之前调用此方法。请注意,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子类中,而Canvas是NSView子类的一个实例。

+0

为什么使用'self.undoer'而不是'NSDocument'的'self.undoManager'? OSX将根据事件循环自动处理'beginUndoGrouping' /'endUndoGrouping',这意味着您的组将被正确创建。如果您使用单独管理的NSUndoManager,则可能无法获得正确的组管理(除非您从'windowWillReturnUndoManager:'返回'self.undoer')。您可能还有重做注册的问题,因为撤消时您似乎没有注册相反的操作。 – gaige

+0

哦,我没有意识到NSDocument类已经有一个撤消管理器。我以为你有责任创建一个。我会考虑的! – PopKernel

+0

是的,那不起作用......关于不注册相反的是什么?我认为这足以将先前的图层保存到数组中并访问它们。 – PopKernel

回答

0

我想通了。我遇到的困惑是我不清楚如何设置重做,所以我误解了文档对于撤销管理员的意义和重做。我现在知道要注册一个重做,我必须注册一个在经理撤销时调用的撤销。