【问题标题】:How can I ensure that Undo and Redo menu items have the action string added?如何确保撤消和重做菜单项添加了操作字符串?
【发布时间】:2011-03-22 04:38:14
【问题描述】:

我的应用中有撤消/重做功能。

我将撤消和重做菜单操作的目标设置为我的应用委托,以使用 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"];
}

【问题讨论】:

    标签: cocoa menu undo-redo


    【解决方案1】:

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

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

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

    【讨论】:

    • 这将解决我没有遇到的问题:错误的菜单字符串。我根本没有得到我的操作字符串。
    • 啊。我懂了。很抱歉没有仔细阅读。您的 -undoableRemoveItemsFromListAtIndexes: 方法是否被任何其他与撤消相关的方法包装,从而导致撤消组?
    • 不。我没有明确创建任何组,您看到的调用是 runloop 中唯一的调用。
    • “重要的是要记住重做是推入重做堆栈的撤消。” ... 你确定吗?例如:我将对象的颜色从红色更改为黄色。撤消将“变为红色”。重做将“变为黄色”。所以,我不明白这怎么可能是一样的。
    • 从概念上讲,是的(如果你做得对的话)。它一直是这样工作的,我所有的应用程序都遵循这种模式(Apple 的例子也是如此)。调用可撤消的“更改颜色”方法将执行“更改为红色”,该方法应自动将“更改为当前颜色”注册为其反向。如果调用反转,则“更改为 CURRENTCOLOR”(带有红色)作为颜色被注册为 ITS 反转。阅读文档。这一切都在那里。在您彻底掌握这个概念之前,构思和计划撤消并不像看起来那么容易。 :-)
    【解决方案2】:

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

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

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

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

    一旦我做了这一切,一切都神奇地起作用了。

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多