使用Xcode 4进行核心数据和撤消操作

时间:2011-12-26 11:04:36

标签: core-data xcode4 objective-c-2.0 nsundomanager

我很少有MacOS的核心数据项目从Xcode 3开始,在Xcode 4中运行良好,特别是对于Undo / Redo管理。 但是现在我从Xcode 4开始了一个新的Core Data项目,我遇到了Undo的问题:UndoRedo菜单项链接到First Responder的Undo:\Redo:方法,就像Xcode 3创建的项目一样;但菜单始终处于禁用状态 所以我从菜单项的Enabled属性绑定到managedObjectContext.undoManager.canUndo / canRedo:这会在用户对对象进行更改时启用菜单,但无论如何撤消操作都没有效果:菜单仍然存在启用但未撤消。
获取撤消的唯一方法是打破菜单项与First Responder的连接,而是再向AppDelegate的新IBActions创建一个:

- (IBAction)myUndoAction:(id)sender  
{
    [[[self managedObjectContext] undoManager] undo];
}

- (IBAction)myRedoAction:(id)sender
{
    [[[self managedObjectContext] undoManager] undo];
}

以这种方式(并且Enable属性绑定到canUndocanRedo)这两个菜单项按预期用于Core Data对象;无论如何,我从未遇到过Xcode 3的这个问题。

其他人是否在使用Xcode 4时遇到此问题?我从头开始重新安装Xcode 4.2.1,以避免旧的模板问题,但我又遇到了同样的问题 我不想安装Xcode 3,只是为了启动一个正常运行的项目,然后将项目迁移到Xcode 4! 我用Google搜索并查看了我认识的每个论坛,也查看了Apple的讨论,但我没有找到任何内容。我在10.7.2。


UPDATE
通过将Undo / Redo链接到AppDelegate会破坏其他操作,因为Undo / Redo将始终从ManagedObjectContext调用NSUndoManager,因此操作必须保持链接到First Responder。 我将不得不坚持使用Xcode 3.2从头开始生成一个核心数据项目,然后从Xcode 4打开它(据我所知,我会发现bug在哪里,可能在模板中......)

1 个答案:

答案 0 :(得分:2)

我能够通过让我的窗口控制器实现NSWindowDelegate协议并让它中继windowWillReturnUndoManager:调用应用程序的委托来解决这个问题。