8

私は、ツリーに似た管理対象オブジェクトのかなり大きな階層を持つコア データ アプリケーションに取り組んでいます。

基本オブジェクトが作成されると、いくつかの子オブジェクトが作成され、それらが独自の子オブジェクトを作成します。これらの子オブジェクトはそれぞれ、NSURLConnections を使用して情報を収集できます。

ここで、managedObjectContext の undoManager で元に戻す/やり直しをサポートしたいと思います。問題は、ユーザーがベース オブジェクトを作成し、そのアクションを元に戻そうとすると、ベース オブジェクトが削除されないことです。代わりに、1 つ以上の子オブジェクトが削除される場合があります。明らかに、この種のアクションは予測不可能で望ましくありません。

ということで、アンドゥ登録をデフォルトで無効にしてみました。disableUndoRegistration:これは、managedObjectContext で何かが変更される前に呼び出すことで行いました。次に、ベースオブジェクトの作成などのベース操作の前に登録の取り消しを有効にし、後で登録を再度無効にします。

元に戻そうとすると、次のエラーが表示されます。

undo: NSUndoManager 0x1026428b0 が無効な状態です。ネストされた undo グループが多すぎる状態で undo が呼び出されました

考え?

4

3 に答える 3

6

NSUndoManager は、変更が登録されるまで、次の実行ループ サイクルを待機します。

// do your stuff

// give the run loop a breath

[[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
[undoManager disableUndoRegistration];
于 2011-01-29T13:58:16.153 に答える
5

この質問が投稿されてから1年以上経ちましたが、とにかくここに答えがあります:

あなたはそれが言うアップルのドキュメントをチェックアウトする必要があります:

.. 元に戻すメッセージは、最後に開いていた元に戻すグループを閉じ、そのグループ内のすべての元に戻す操作を適用します... 元に戻すが呼び出されたときに、閉じられていないネストされた元に戻すグループがスタックにある場合、例外が発生します。ネストされたグループを元に戻すには、endUndoGrouping メッセージで明示的にグループを閉じてから、undoNestedGroup を使用して元に戻す必要があります。

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Conceptual/UndoArchitecture/Articles/PerformingUndo.html

于 2012-01-06T13:48:33.320 に答える
0

私の交差にNSUndoManager is in invalid state, undo was called with too many nested undo groupsはCoreDataは含まれていませんでしたが、私の答えはそれでもなお役立つかもしれません。

私の場合、NSUndoManager -undo の呼び出し中に発生したコード内のキャッチされない例外が原因で、元に戻すマネージャーの例外が発生しました。

コンソールを振り返ると、アプリ コードの例外と取り消しマネージャーの NSInternalInconsistencyException の両方が表示されました。

デフォルトの runloop 取り消しグループ動作を使用し、取り消し登録を明示的にグループ化しませんでした。

于 2012-12-28T13:44:28.903 に答える