私はCocoaドキュメントベースのアプリを持っていて、Core Dataにすべてを処理させているのに、NSUndoManagerでいくつかの問題が発生しています。
したがって、新しい永続ドキュメントが作成されるたびに、ルートコンテキストと子コンテキストを作成します。ルートコンテキストは永続ドキュメントへの書き込みを担当し、子コンテキストはNSManagedObjectsの作成/編集/削除を介して変更するコンテキストです。ルートコンテキストを親コンテキストとして設定しました。また、子コンテキストの元に戻るマネージャーを、NSPersistentDocumentで作成された元のコンテキストに設定しました。うまくいけば、それをもう少し明確にするためのいくつかのコードがあります:
// create root context
NSManagedObjectContext *rootContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
// startContext is the context created with the document
[rootContext setPersistentStoreCoordinator:[startContext persistentStoreCoordinator]];
NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
// set root as parent
[childContext setParentContext:rootContext];
// set undo
[childContext setUndoManager:[startContext undoManager]];
私がこれをすべて行う理由は、ここで説明されているのと同様の問題が発生したため です。ドキュメントNSManagedObjectContextの保存をすぐに有効にしますか?
これは、NSUndoManagerに触れるアプリケーションの唯一のコードであるため、これを取り上げます。NSManagedObjectsを挿入し、挿入を元に戻すだけでアプリをテストしています。2回元に戻した後、場合によっては5回、場合によっては10回行った後、次のエラーが発生することがあります。
_endUndoGroupRemovingIfEmpty:: NSUndoManager 0x100159f30 is in invalid state, endUndoGrouping called with no matching begin
2013-01-29 21:31:23.375 TestApplication[30125:303] (
0 CoreFoundation 0x00007fff8a54f0a6 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff8215f3f0 objc_exception_throw + 43
2 CoreFoundation 0x00007fff8a54ee7c +[NSException raise:format:] + 204
3 Foundation 0x00007fff80ea021f -[NSUndoManager _endUndoGroupRemovingIfEmpty:] + 195
4 Foundation 0x00007fff80ea0154 -[NSUndoManager endUndoGrouping] + 42
5 Foundation 0x00007fff80ed79da +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 447
6 AppKit 0x00007fff8253632d -[NSApplication run] + 687
7 AppKit 0x00007fff824dacb6 NSApplicationMain + 869
8 TestApplication 0x0000000100001512 main + 34
9 TestApplication 0x00000001000014e4 start + 52
したがって、デバッグ情報を正しく読み取っている場合は、呼び出す必要があります[[context undoManager] beginUndoGrouping]
が、これに関する問題は、プログラムのどこで `[[contextundoManager]endUndoGrouping]'を使用しないかということです。誰かがこれを以前に経験したことがありますか?
どんな助けでも大歓迎です。