博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS开发之Cocoa编程—— NSUndoManager
阅读量:4950 次
发布时间:2019-06-11

本文共 1023 字,大约阅读时间需要 3 分钟。

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

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

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

    这里需要注意的是,堆栈中存放的都是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];

}

    UndoManager还可以设置撤销菜单动作的名称:
    [undoManager setActionName:@"Insert"];

转载于:https://www.cnblogs.com/zsw-1993/archive/2013/02/16/4880406.html

你可能感兴趣的文章
chrome收藏夹整理
查看>>
用ctrl+鼠标滚动调节字体大小
查看>>
查数据库有哪些表、查数据库
查看>>
使用git上传github遇到的问题
查看>>
静态页面菜单栏布局整改使用iframeset
查看>>
图解HTTP学习笔记——简单的HTTP协议
查看>>
Java Finally
查看>>
卑鄙的外乡人——公共知识与共有知识
查看>>
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。...
查看>>
Spring中的Advisor,Advice,Pointcut
查看>>
20165223 实验二 面向对象程序设计
查看>>
30岁前不要让人生留下遗憾笔记
查看>>
如何注册EPIMATE
查看>>
交易进行中买家申请退货退款操作流程
查看>>
常用技巧之JS判断数组中某元素出现次数
查看>>
Oracle命令:授权-收回权限-角色-用户状态
查看>>
云打码识别验证码
查看>>
在Kafka中使用Avro编码消息:Producter篇
查看>>
分布式跟踪调研与设计
查看>>
解读python中SocketServer源码
查看>>