NSUndoManager

NSUndoManager 体系

demo 地址


  • NSUndoManager 官方文档

NSUndoManager 可撤销操作,也可以逆向撤销操作

undo 操作包含在 undo操作组中,也可以用 undo操作组中的动作做逆向 undo 操作。这个操作组存储在栈中。undo manager 执行时候方法 undo 或者 redo 时,实际上就是在执行 undo 操作组中的操作。例如:用户可以改变文字的字体和字体大小,应用程序会囊括所有的字体属性操作作为一个组,所以,当用户执行 undo 时,字体和字体大小都会复原。只有undo 操作组中还有undo 动作,就会执行 undo 操作。

redo 操作和 redo 操作组 就是存储在一个单独栈中的 undo操作组。

在 run loop 中 NSUndoManager 会自动创建 undo 组,用来存储 undo 操作记录,当 loop 开始时创建 undo 组,当 loop 结束时,关闭 undo 组,使用方法 beginUndoGroupingenableUndoRegistration 创建额外的嵌套的 undo 组,也可以使用方法 setGroupsByEvent:来断开默认的 undo 组。


undo 和 Redo 栈
undo 组被存储在栈中,老 undo 组在栈底 新 undo 组在栈顶,undo 组默认不加限制。可以使用方法 setLevelsOfUndo 添加最大组数限制。当超过最大限制,最老的 undo 组会被从栈底弹出。

初始情况下,undo 栈和 redo 栈都是空的,undo 操作被记录在 undo 组中,直到 undo 执行之前 redo 栈都保持空,执行 undo 操作时,undo 栈顶的 undo 组被应用到对象上,一旦这个操作改变了对象状态,这时假想 对象注册了新的 undo manager 操作,这个操作与原先的操作相反。只要执行力 undo 操作,我们都会用 redo 栈把这个操作当做 redo 操作记录下来。连续的 undo 操作被加入到 redo 栈中.
当 redo 栈中弹出一个 redo 组,应用到 对象上,undo 栈就会把这个操作加入 undo 栈中


  • undo 的一般用法
- (void)setMyObjectTitle:(NSString *)newTitle {
 
    NSString *currentTitle = [myObject title];
    if (newTitle != currentTitle) {
         // 注册 undo 操作,这里注意传值为旧值:currentTitle
        [undoManager registerUndoWithTarget:self
                selector:@selector(setMyObjectTitle:)
                object:currentTitle];
        [undoManager setActionName:NSLocalizedString(@"Title Change", @"title undo")];
        [myObject setTitle:newTitle];
    }
}
  • undo 基于调用的用法, 可以传入非对象参数如基本数据类型:CGFloat
- (void)setMyObjectWidth:(CGFloat)newWidth height:(CGFloat)newHeight{
 
    float currentWidth = [myObject size].width;
    float currentHeight = [myObject size].height;
    if ((newWidth != currentWidth) || (newHeight != currentHeight)) {
        // 同样,这里需要传入旧状态的值:currentWidth, currentHeight
        [[undoManager prepareWithInvocationTarget:self]
                setMyObjectWidth:currentWidth height:currentHeight];
        [undoManager setActionName:NSLocalizedString(@"Size Change", @"size undo")];
        [myObject setSize:NSMakeSize(newWidth, newHeight)];
    }
}
  • 撤销操作
[_undoManager redo];
  • 复原操作
[_undoManager undo];

demo 地址


你可能感兴趣的:(NSUndoManager)