首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在块中使用NSUndoManager

在块中使用NSUndoManager
EN

Stack Overflow用户
提问于 2012-10-03 03:52:05
回答 1查看 275关注 0票数 1

我正在尝试添加一些撤消/重做到块代码(从NSOpenPanel导入一些文件),只要代码源自块,主代码就会工作,但NSUndoManager代码不会保存,也不会给出任何错误。只要NSUndoManager代码不在代码块中,它就可以在其他任何地方运行

示例NSUndoManager代码如下所示:

代码语言:javascript
复制
// Undo Work
id  undoObject = [NSApp targetForAction:@selector(undoManager) to:nil from:self];
NSUndoManager *undoManager = [undoObject undoManager];
[[undoManager prepareWithInvocationTarget:self] deleteImages];
[undoManager setActionName:@"import images"];

下面显示了代码工作和不工作的地方:

代码语言:javascript
复制
/* 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 */
EN

回答 1

Stack Overflow用户

发布于 2012-10-21 07:36:18

块在堆栈上,所以当撤销操作被调用时,撤销管理器对象可能已经被释放(或者如果没有,设置为nil).So确保撤销管理器将是活动的,声明为类实例,或者使用__block语法(不使用ARC):

代码语言:javascript
复制
__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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12697262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档