无法撤消&重做在可可核心数据应用程序中工作

时间:2016-02-11 03:00:14

标签: objective-c cocoa nsundomanager

我在核心数据cocoa应用程序中实现undo和redo时遇到问题。这是我在同一主题(you can read my first question here)上提出的第二个问题,即使我在第一个问题上得到了可靠的建议,我仍然无法进行撤销和重做工作。

无论如何......这是我目前的代码:

以下是MainWindowController.h文件中的相关代码:

#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"

@property (nonatomic,strong) NSManagedObjectContext *mObjContext;
@property AppDelegate *appDelegate;

以下是MainWindowController.m文件中的代码:

#import "MainWindowController.h"
@interface MainWindowController () <NSWindowDelegate>

@end

@implementation MainWindowController

- (void)windowDidLoad {
    self.appDelegate = (AppDelegate*)[[NSApplication sharedApplication] delegate];
    self.mObjContext = self.appDelegate.managedObjectContext;
    [[self window]setDelegate:self];
    [self windowWillReturnUndoManager:self.window];
}

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window
{
    return [[self document] undoManager];
}

@end

我的窗口在连接检查器中有以下Outlets:delegate:文件的所有者

菜单:MainMenu

每当我对nstableviews中的记录进行更改时,都会记录更改,但撤消和重做菜单项仍为灰色。我在windowWillReturnUndoManager中放置了断点,但我看不到任何undoManager返回那里......谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:1)

您正在返回文档的undoManager(可能为nil),而不是托管对象上下文的undoManager。将windowWillReturnUndoManager更改为

- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window
{
    return self.mObjContext.undoManager;
}

答案 1 :(得分:0)

嗯,问题终于解决了。我添加了新的编辑菜单项,同时保留旧的菜单项。当我在记录中进行更改时,新菜单项具有撤消项可用和工作。重做也工作。

所以我删除了旧的编辑菜单项,现在一切都像魅力一样。太糟糕了,我没有早点尝试过,但...... ....