程序开发中我们经常会用到的两个快捷键Ctrl+Z和Ctrl+C,撤销和复制,Cocoa开发也可以实现这两个操作,为我们提供非常简单的操作类NSUndoManger,也可以称之为撤销管理器,NSUndoManger内部维护两个栈,undo栈和redo栈。创建一个可撤销的操作需要创建一个逆向的操作,然后通过逆向的操作达到做出对应的改变,实现起来非常简单。

首先我们来看一个非常简单的例子:

        Message  *msg=[[Message alloc]init];
[msg addObjectMethod:@"FlyElephant"];
[msg addObjectMethod:@"http://www.cnblogs.com/xiaofeixiang/"];
NSLog(@"%@",msg.mutableArr);
[msg.undoManger undo];//取消
NSLog(@"%@",msg.mutableArr);
[msg.undoManger redo];//重做
NSLog(@"%@",msg.mutableArr);

Message类中可变数组属性mutaleArr,先来观察一下结果,可以思考一下是如何实现的:

数组初始化元素为init,之后我们新增两个新元素,这个时候通过undo取消了新加入的元素,之后我们通过redo将删除的元素又重新加入到了数组中;

-(void)addObjectMethod:(NSString *)str{
[[self.undoManger prepareWithInvocationTarget:self] removeObjectMethod:str];//逆向删除
[self.mutableArr addObject:str];
} -(void)removeObjectMethod:(NSString *)str{
[[self.undoManger prepareWithInvocationTarget:self] addObjectMethod:str];//逆向添加
if ([self.mutableArr containsObject:str]) {
[self.mutableArr removeObject:str];
}
}

如果细心会发现我们在两个对应的方法中都加入了对应的逆向操作,如果你只需要取消,那么在removeObjectMethod方法中,不需要进行逆向操作,当然使用redo方法时也就不能执行,具体可以根据的需求而定;

撤销管理器记录的操作有三个方法:

- (id)prepareWithInvocationTarget:(id)target;
- (void)registerUndoWithTarget:(id)target selector:(SEL)selector object:(nullable id)anObject;
- (void)registerUndoWithTarget:(id)target handler:(void (^)(id target))undoHandler NS_AVAILABLE(10_11, 9_0) NS_REFINED_FOR_SWIFT;
prepareWithInvocationTarget是我们使用的,当然你可以通过registerUndoWithTarget:(id)target selector:(SEL)selector object:(nullable id)anObject来使用,registerUndoWithTarget:hanlder通过block的形式进行传递修改, 不过需要在iOS9中才可以使用,使用的时候避免造成保留环~

iOS开发-NSUndoManager撤销(undo)和重做(redo)的更多相关文章

  1. iOS - OC iOS 开发体系

    1.iOS 开发技术体系 iOS 开发技术体系图: 层级 主要框架 Cocoa Touch UIKit 等 Media Core Graphics .OpenGl ES.Core Animation ...

  2. iOS - Swift iOS 开发体系

    1.iOS 开发技术体系 iOS 开发技术体系图: 层级 主要框架 Cocoa Touch UIKit 等 Media Core Graphics .OpenGl ES.Core Animation ...

  3. iOS 开发技术体系

    iOS 开发技术体系图: - 层级 | 主要框架 - ---------------------|--------------------------------------------------- ...

  4. iOS开发OC基础:Xcode中常见英文总结,OC常见英文错误

    在开发的过程中难免会遇到很多的错误,可是当看到系统给出的英文时,又不知道是什么意思.所以这篇文章总结了Xcode中常见的一些英文单词及词组,可以帮助初学的人快速了解给出的提示.多练习,就肯定能基本掌握 ...

  5. Oracle 回滚(ROLLBACK)和撤销(UNDO)

    一.回滚(ROLLBACK)和撤销(UNDO) 回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段. 在9i版本以前 Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实 ...

  6. 2 万字 + 30 张图 | 细聊 MySQL undo log、redo log、binlog 有什么用?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com/ 大家好,我是小林. 从这篇「执行一条 SQL 查询语句,期间发生了什么?」中,我们知道了一条查询语句经历 ...

  7. 【IOS开发笔记02】学生管理系统

    端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...

  8. iOS开发系列--无限循环的图片浏览器

    --UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件 ...

  9. [转]undo log与redo log原理分析

    数据库通常借助日志来实现事务,常见的有undo log.redo log,undo/redo log都能保证事务特性,这里主要是原子性和持久性,即事务相关的操作,要么全做,要么不做,并且修改的数据能得 ...

随机推荐

  1. sql分组获取第一条或者最小一条值

    很多人都在问这个问题,现在记录一下 select id from test as a where id = (select min(b.id ) from test as b where a.pid ...

  2. IntelliJ IDEA设置不自动打开最后关闭的项目

  3. JVM启动过程 类加载器

    下图来自:http://blog.csdn.net/jiangwei0910410003/article/details/17733153 package com.test.jvm.common; i ...

  4. A. 【UNR #2】UOJ拯救计划

    题解: 感觉多了解一些npc问题是很有用的.. 就不会像我一样完全不考虑模数的性质 前面60分大概是送分 后面主要考虑一下%6带来的影响 平常都是那么大的模数,突然这么小??? 考虑正好使用k种颜色的 ...

  5. BZOJ1406 [AHOI2007]密码箱 数论

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1406 题意概括 求所有数x,满足 x<n 且 x2≡1 (mod  n). n<=2 ...

  6. BZOJ1079 [SCOI2008]着色方案 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1079 题目概括 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的 ...

  7. Mq的介绍

    1.使用场景 异步处理 日志收集 流量削峰 应用解耦 2.通信协议 高级消息队列协议(AMQP). 参考文档:http://www.huangxiaobai.com/archives/1267

  8. Python 中常见错误总结

    IndentationError: unexpected indent Python 中强制缩进,, IndentationError: unexpected indent 缩进错误 这类错误非常常见 ...

  9. HDU - 1712 - ACboy needs your help 【分组背包】

    <题目链接> 题目大意:有n个课程,现在花M天来学习这些课程,学习每个课程花的天数所得到的价值不同,求M天怎么分配学习才能得到的价值最大.(这些课程得到的价值和所花天数的关系由矩阵给出) ...

  10. Mongodb - 二进制安装

    0.概述 mongodb版本:4.0.2 linux版本:redhat 6.5 安装方式:二进制安装 1.关闭防火墙 /etc/init.d/iptables status/etc/init.d/ip ...