1

ブロックコードに元に戻す/やり直しを追加しようとしています(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 */
4

1 に答える 1

0

ブロックはスタック上にあるため、undoアクションが呼び出されると、おそらくundo managerオブジェクトの割り当てが解除されます(そうでない場合はnilに設定されます)。したがって、undo managerが有効であることを確認し、クラスとして宣言します。インスタンス、または__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に設定できます。

于 2012-10-20T23:36:17.580 に答える