IOS开发之Cocoa编程—— NSUndoManager
来源:互联网 发布:如何加强网络安全管理 编辑:程序博客网 时间:2024/04/30 05:29
在Cocoa中使用NSUndoManager可以很方便的完成撤销操作。NSUndoManager会记录下修改、撤销操作的消息。这个机制使用两个NSInvocation对象栈。
NSInvocation会把消息(选择器和接受者及参数)包装成一个对象,这个对象就是NSInvocation的实例。当一个对象收到它不理解的消息时,消息发送机制会在报出错误前检查该对象是否实现了forwardInvocation这个方法。如果实现了,就会将消息打包成NSInvocation对象,然后调用forwardInvocation方法。
当进行操作时,控制器会添加一个该操作的逆操作的invocation到Undo栈中。当进行Undo操作时,Undo操作的逆操作会倍添加到Redo栈中,就这样利用Undo和Redo两个堆栈巧妙的实现撤销操作。
这里需要注意的是,堆栈中存放的都是NSInvocation实例。
假设在我们的程序中有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 setActionName:@"Insert"];
- (void)viewDidLoad{ [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. undoManager = [[NSUndoManager alloc]init]; [undoManager setLevelsOfUndo:999]; }-(void)buttonClick:(id)sender{ UIButton * btn = (UIButton*)sender; switch (btn.tag) { case 1: [self.undoManager undo]; break; case 2: [self.undoManager redo]; break; case 3: [self add]; break; case 4: [self sub]; break; default: break; }}-(void)add{ int nu = [num.text integerValue] + 10; [num setText:[NSString stringWithFormat:@"%d",nu]]; [[undoManager prepareWithInvocationTarget:self] sub];}-(void)sub{ int nu = [num.text integerValue] - 10; [num setText:[NSString stringWithFormat:@"%d",nu]]; [[undoManager prepareWithInvocationTarget:self] add];}
0 0
- IOS开发之Cocoa编程—— NSUndoManager
- IOS开发之Cocoa编程—— NSUndoManager
- IOS开发之Cocoa编程—— NSUndoManager
- IOS开发之Cocoa编程—— NSUndoManager
- IOS开发之Cocoa编程—— NSUndoManager
- IOS开发之Cocoa编程—— NSUndoManager
- IOS开发 NSUndoManager
- iOS开发笔记之十七——学习Cocoa和Cocoa Touch框架
- Cocoa NSUndoManager (REDO/UNDO)
- Cocoa中的NSUndoManager
- Cocoa中的NSUndoManager
- iOS开发之Cocoa是什么
- IOS学习之——Cocoa 和Cocoa Touch
- IOS 之 NSUndoManager撤销与恢复系列
- iOS学习笔记10(8)—深入浅出 Cocoa 多线程编程之 block 与 dispatch quene
- [深入浅出Cocoa]iOS网络编程之Socket
- [深入浅出Cocoa]iOS网络编程之CFNetwork
- [深入浅出Cocoa]iOS网络编程之NSStream
- JavaScript编写规范
- Linux Shell常用技巧(二)
- POJ 3461 Oulipo(KMP字符串匹配)
- TP-LINK利用MAC绑定限制上网用户
- Linux Shell常用技巧(三)
- IOS开发之Cocoa编程—— NSUndoManager
- (五)实现更多功能
- 测试Qt的数据库驱动支持
- 游览珠海校区
- 欧拉公式
- Linux Shell常用技巧(四)
- 【PHP】 LINUX PHP执行
- 《数据结构》各章教学资源
- 点乘,叉乘总结