iOS开发-NSUndoManager撤销(undo)和重做(redo)

本文介绍Cocoa开发中撤销管理器NSUndoManager的应用。通过维护undo和redo栈,实现撤销与重做功能。示例代码展示了如何创建可撤销操作及其逆向操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

1
2
3
4
5
6
7
8
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将删除的元素又重新加入到了数组中;

1
2
3
4
5
6
7
8
9
10
11
-(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方法时也就不能执行,具体可以根据的需求而定;

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

1
2
3
- (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;
1
<span style="font-family: 'Microsoft YaHei'; font-size: 14px;">prepareWithInvocationTarget是我们使用的,当然你可以通过registerUndoWithTarget:(id)target selector:(SEL)selector object:(nullable id)anObject来使用</span><span style="font-family: 'Microsoft YaHei'; font-size: 14px;">,registerUndoWithTarget:hanlder通过block的形式进行传递修改, 不过需要在iOS9中才可以使用,使用的时候避免造成保留环~</span>
本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5095995.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值