IOS开发之Cocoa编程—— NSUndoManager

在Cocoa中使用NSUndoManager能够很方便的完成撤销操做。NSUndoManager会记录下修改、撤销操做的消息。这个机制使用两个NSInvocation对象栈。ios

     NSInvocation会把消息(选择器和接受者及参数)包装成一个对象,这个对象就是NSInvocation的实例。当一个对象收到它不理解的消息时,消息发送机制会在报出错误前检查该对象是否实现了forwardInvocation这个方法。若是实现了,就会将消息打包成NSInvocation对象,而后调用forwardInvocation方法。app

    1) NSUndoManager工做原理spa

    当进行操做时,控制器会添加一个该操做的逆操做的invocation到Undo栈中。当进行Undo操做时,Undo操做的逆操做会倍添加到Redo栈中,就这样利用Undo和Redo两个堆栈巧妙的实现撤销操做。code

    这里须要注意的是,堆栈中存放的都是NSInvocation实例。对象

 

    2)示例
    假设在咱们的程序中有walkLeft以及这个方法的逆方法walkRight,咱们能够这样来实现撤销功能。
- (void) walkLeft
{
    position = position + 10;
    [[undoManager prepareWithInvocationTarget:self] walkRight];
    [self showTheChangesToThePostion];
}

    prepareWithInvocationTarget:方法记录了target并返回UndoManager,而后UndoManager重载了forwardInvocation方法,也就将walkRight方法的Invocation添加到undo栈中了。
   
- (void) walkRight
{
    position = position - 10;
    [[undoManager prepareWithInvocationTarget:self] walkLeft];
    [self showTheChangesToThePostion];get

}it

 

    UndoManager还能够设置撤销菜单动做的名称:
    [undoManager setActionName:@"Insert"];io

   相关Demo
相关文章
相关标签/搜索