【问题标题】:Undo/Redo Menu Items not working with Document based app OSX 10.7撤消/重做菜单项不适用于基于文档的应用程序 OSX 10.7
【发布时间】:2012-02-10 20:06:42
【问题描述】:

我使用 Core Data 创建了一个非常简单的基于文档的测试应用程序。我没有编码,只是把它连接起来。 XIB 文件有一个数组控制器、一个表格视图和两个按钮,一个用于添加行,一个用于删除。数组控制器绑定了文件所有者的 managedObjectContext。表的列绑定到模型中定义的三个实体。这些按钮连接到阵列控制器的添加和删除操作。而已。该应用程序运行良好,但在添加或删除行后,撤消和重做的菜单项保持禁用状态。您需要做些什么才能在此级别启用撤消/重做功能吗?

【问题讨论】:

    标签: macos cocoa data-binding undo nsdocument


    【解决方案1】:

    如果菜单项被禁用,则意味着响应者链中没有任何内容可以响应它发送的消息。在这种情况下,这可能意味着您的窗口没有返回 undoManager。你需要在你的窗口控制器中有这样的东西:

    - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)sender
    {
        return [self.managedObjectContext undoManager];
    }
    

    【讨论】:

      【解决方案2】:

      我觉得这里的问题可能和这个有关:

      表格的列绑定到模型中定义的三个实体。

      我什至不确定您将如何做到这一点(将不同的列绑定到不同的实体。)我想知道您的意思是“在模型中的一个实体上定义的三个属性”,但我不确定。

      无论如何,我复制了类似于您的设置的内容:一个简单的实体 Person,具有一个字符串属性 name,一个 NSArrayController,处于实体模式,绑定到(文件的所有者,,managedObjectContext),一个具有一列的 NSTableView,绑定到 (Array Controller, managedObjects, name) 并且一切正常,包括撤消和重做。

      我建议从那个简单的点开始(一个实体、一个属性、一列,一切正常),一次添加一个小东西的复杂性/功能,直到出现问题 - 当它出现问题时,您会确切知道是什么弄坏了它。幸运的是,您是从样板开始的,因此没有太多额外的应用程序逻辑阻碍。

      【讨论】:

      • 感谢您的回复。你是对的,我将列绑定到同一实体的不同属性。我的问题是没有将阵列控制器设置为 实体模式。现在我的问题是试图理解为什么我的更复杂的应用程序不起作用。谢谢!
      • 所以,回到我更复杂的例子,我将windowWillReturnUndoManager 添加到我的NSPersistentDocument 子类中,它起作用了!!这很有趣,因为一个简单的开箱即用的子类NSPersistentDocument 在没有这种方法的情况下也可以工作。同样有趣的是,NSDocumentNSPersistentDocument 似乎都不遵守定义windowWillReturnUndoManagerNSWindowDelegate 协议。那么,有趣的问题是,这甚至是如何开箱即用的??
      • ArrayController 可以访问 undoManager,因为您将它绑定到 managedObjectContext,它可以访问它,因为它归 NSDocument 拥有,这里实际上是窗口委托。此外,虽然许多 Cocoa 委托接口被声明为协议,但我的理解是,该工具包将接受几乎任何东西作为委托,并将通过调用 respondsToSelector: 来测试它对某些方法的实现:在实际尝试调用委托方法之前。这些协议对开发人员的作用更多的是一种提示,而不是一种严格的类型安全机制。
      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多