使用Objective-C中的嵌套方法调用正确处理撤消/重做?

时间:2014-06-21 17:03:03

标签: objective-c arrays macos undo nsundomanager

我想不出更好的方式来提出这个问题,所以如果标题毫无意义,我会道歉。基本上,我在控制器级别为我的应用程序的一部分实现了撤销/重做,我不断遇到这个琐碎的问题。我有两种方法:

- (void)addNote:(BSDNote *)note;
- (void)duplicateNote:(BSDNote *)note;

-addNote:方法中,note对象被添加到可变数组中。我还更新了其他一些东西,但是出于我的例子的目的,我们只是说一个对象被添加到一个数组中。然而,在将对象添加到数组之前,我使用文档NSUndoManager注册撤消操作,如下所示:

if ( [self.undoManager levelsOfUndo] > 0 ) {
    [self.undoManager endUndoGrouping];
    [self.undoManager beginUndoGrouping];
}

[self.undoManager registerUndoWithTarget:self selector:@selector(deleteNote:) object:note];
[self.undoManager setActionName:NSLocalizedString(@"Add Note", @"Add Note undo action name")];

它本身就有意义,一切都很好。我不确定的是从-addNote:方法中调用-duplicateNote:方法。

-duplicateNote:方法中,复制note对象,然后使用-addNote:方法将其添加到可变数组中。由于我正在复制对象,我想在-duplicateNote:的堆栈中添加撤消操作,而不是-addNote:

我唯一能想到的是在-duplicateNote:方法中做这样的事情:

[self.undoManager registerUndoWithTarget:self selector:@selector(deleteNote:) object:note];
[self.undoManager setActionName:NSLocalizedString(@"Duplicate Note", @"Duplicate Note undo action name")];

// I make a copy of the note here (noteCopy), along with other miscellaneous stuff.

[self.undoManager disableUndoRegistration];
[self addNote:noteCopy];
[self.undoManager enableUndoRegistration];

我是否认为这是一种处理这种情况的好方法?撤消/重做操作的整个“分组”让我的头部受到伤害,所以我确定我忽略了某些东西,或者有一种更好的方式。如果有人知道这种更好的方式,你会介意向我解释(就像我五岁)吗?

1 个答案:

答案 0 :(得分:0)

本,我认为你是在思考它。如果创建的最后一个实例是“重复注释”,则在duplicateNote方法执行时向堆栈添加“撤消”是有意义的。

祝你好运!