我正在尝试添加一些撤消/重做到块代码(从NSOpenPanel导入一些文件),只要代码源自块,主代码就会工作,但NSUndoManager代码不会保存,也不会给出任何错误。只要NSUndoManager代码不在代码块中,它就可以在其他任何地方运行
示例NSUndoManager代码如下所示:
// Undo Work
id undoObject = [NSApp targetForAction:@selector(undoManager) to:nil from:self];
NSUndoManager *undoManager = [undoObject undoManager];
[[undoManager prepareWithInvocationTarget:self] deleteImages];
[undoManager setActionName:@"import images"];下面显示了代码工作和不工作的地方:
/* NSUndoManager code works */
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:[self.windowController window]
completionHandler:^(NSInteger result) {
if (result == NSFileHandlingPanelOKButton) {
/* NSUndoManager code does not work,
it also does not work inside importImages: */
[self importImages:[openPanel URLs]];
} else {
[openPanel close];
}
}];
/* NSUndoManager code works */发布于 2012-10-21 07:36:18
块在堆栈上,所以当撤销操作被调用时,撤销管理器对象可能已经被释放(或者如果没有,设置为nil).So确保撤销管理器将是活动的,声明为类实例,或者使用__block语法(不使用ARC):
__block NSUndoManager* undoManager;
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel beginSheetModalForWindow:[self.windowController window]
completionHandler:^(NSInteger result) {
if (result == NSFileHandlingPanelOKButton) {
id undoObject = [NSApp targetForAction:@selector(undoManager) to:nil from:self];
undoManager=[undoObject undoManager];
[[undoManager prepareWithInvocationTarget:self] deleteImages];
[undoManager setActionName:@"import images"];
[self importImages:[openPanel URLs]];
} else {
[openPanel close];
}
}];使用完撤销管理器后,可以将其设置为nil。
https://stackoverflow.com/questions/12697262
复制相似问题