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子类的一个实例。
为什么使用'self.undoer'而不是'NSDocument'的'self.undoManager'? OSX将根据事件循环自动处理'beginUndoGrouping' /'endUndoGrouping',这意味着您的组将被正确创建。如果您使用单独管理的NSUndoManager,则可能无法获得正确的组管理(除非您从'windowWillReturnUndoManager:'返回'self.undoer')。您可能还有重做注册的问题,因为撤消时您似乎没有注册相反的操作。 – gaige
哦,我没有意识到NSDocument类已经有一个撤消管理器。我以为你有责任创建一个。我会考虑的! – PopKernel
是的,那不起作用......关于不注册相反的是什么?我认为这足以将先前的图层保存到数组中并访问它们。 – PopKernel