解像度
NSUndoManager子でのみ使用する必要がありますNSManagedObjectContext(コア データで使用する場合)。これは、UIManagedDocumentが任意の時点で自動保存される可能性があり、その後undoは が無効になるためです。したがってNSUndoManager、子コンテキストでも同じ結果が得られるため、保存/キャンセル機能を実現するために を使用しても意味がありません。
子コンテキストよりも実装がはるかに簡単なので、本当に少し悲しいです(後者の場合、オブジェクトを親から子にコピーするNSUndoManagerために呼び出す必要があります-苦痛です)。existingObjectWithID個人的には、ドキュメントが自動保存されるべきではないと思っていたでしょうgroupingLevel != 0。ラント終了。
元の質問
Core Data を使用してデータを にロードするテーブル ビュー コントローラーがありますUIManagedDocument。テーブル内の各行を編集するビュー コントローラーにセグエします。そのView Controllerには、キャンセルボタンと保存ボタンがあります。NSUndoManagerオブジェクトのカテゴリを使用してキャンセル機能を実装していNSManagedます (self.list以下)。
- (void)viewDidLoad
{
[super viewDidLoad];
[self.list beginEdit];
}
- (IBAction)cancel:(id)sender
{
[self.list cancelEdit];
[self close];
}
- (IBAction)save:(id)sender
{
[self.list endEdit];
[self close];
}
このカテゴリは を実装beginEditしておりendEdit、cancelEditこれは NSUndoManager のものを処理することを目的としています。以下のコードでuseUndoは、NSUndoManager を使用した場合の影響を確認するために NO または YES に設定した定数です。
- (void)beginEdit
{
if (useUndo)
{
NSUndoManager *undoManager = [[NSUndoManager alloc] init];
self.managedObjectContext.undoManager = undoManager;
[undoManager beginUndoGrouping];
}
}
- (void)endEdit
{
[self.managedObjectContext save:nil];
if (useUndo)
{
NSUndoManager *undoManager = self.managedObjectContext.undoManager;
[undoManager endUndoGrouping];
self.managedObjectContext.undoManager = nil;
}
}
- (void)cancelEdit
{
if (useUndo)
{
NSUndoManager *undoManager = self.managedObjectContext.undoManager;
[undoManager endUndoGrouping];
[undoManager undo];
}
}
オブジェクトを保存して [ホーム] ボタンをクリックすると、変更がコミットされていることを示す Core Data デバッグ メッセージが表示されますuseUndo = NO。ただし、useUndo = YESホームボタンをクリックしても自動保存されません。数分待ちましたが、まだ自動保存されません。自動保存を強制する方法はありますか?
undoManager を使用するとこの動作が変化する理由を誰か説明できますか?
これについて間違った方法で行っているか、コードに単純な問題があると思われます。どんな助けでも大歓迎です。