2

我在我的应用程序中有撤消/重做工作。

我将撤消和重做菜单操作的目标设置为我的应用程序委托,以使用 undoAction: 和 redoAction: 方法实现这些操作。菜单项的启用绑定绑定到我的撤消管理器的 canUndo 和 canRedo 属性,并且这些属性按预期工作。当我推送到撤消堆栈时,我设置了一个操作名称,但从未在菜单中看到它。

为什么我的菜单总是显示 Undo 或 Redo,而不是 Undo Move to Trash 和 Redo Move to Trash ?菜单项通常会被我绕过的一些魔法更新吗?我没有使用响应者链,因为我的应用程序委托不在响应者链中,因此永远看不到操作。

撤消管理器是在我的应用程序委托中创建的。

更新:更改为使用窗口的撤消管理器没有区别。

-(void)undoableRemoveItemsFromListAtIndexes:(NSIndexSet*)itemIndexes;
{
    NSArray *removedItems = [[self.listController arrangedObjects] objectsAtIndexes:itemIndexes];
    [[self.undoManager prepareWithInvocationTarget:self] undoableAddItems:removedItems toListAtIndexes:itemIndexes];
    [self removeItemsFromListAtIndexes:itemIndexes];
    [self.undoManager setActionName:@"Move to Trash"];
}
4

2 回答 2

1

检查撤消管理器是否 -isUndoing 并适当地交换字符串。

NSUndoManager * um = [self undoManager];
// ...
[um setActionName:([um isUndoing]) ? @"Remove Foo" : @"Add Foo"];

重要的是要记住重做是推入重做堆栈的撤消。

于 2011-03-22T13:35:35.600 回答
0

结果证明是以下一项或多项(来自 NSCoder night Campbell 的帮助):

  • 使用窗口的撤消管理器,而不是我创建的

  • 删除我拥有的绑定并将菜单项连接到 First Responder

  • 将我的应用委托中的方法命名为 undo: 和 redo:

一旦我做了所有这一切,它就神奇地起作用了。

于 2011-03-23T04:26:30.257 回答