2009-08-07 19 views
12

私はコアデータをiPhoneで使用して元に戻すサポートを実装しようとしていますが、いくつかの問題がありました。コアデータを元に戻す管理

私は現在いくつかの管理対象オブジェクトを設定していますが、プロパティを変更すると、これらの変更は元に戻すマネージャによって記録されません。私の理解から、Core Dataはこれを自動的にセットアップすることになっており、管理対象オブジェクトの変更、作成、削除に対して基本的な取り消しとやり直しをサポートできるはずです。

オブジェクトを変更して、元に戻すマネージャによって記録される特別な方法はありますか?または、変更ごとに取り消しアクションを登録する必要がありますか?

また、アプリケーションが特定のオブジェクトを編集するための詳細ビューにスライドするとします。私はキャンセルボタンがヒットしたときに行われたすべての変更を取り消すことができるようにしたいと思います。ここでグループ化を元に戻すことはできますか?グループをコミットするときと、別の元に戻すマネージャが詳細ビューでより細かいアクションを管理するのに対して、1つの元に戻すマネージャ(管理されたオブジェクトコンテキストに含まれるマネージャ)を使用するだけの違いは何ですか?

ありがとうございます!

答えて

24

元に戻す機能はほとんど機能しますが、取り消しをサポートするNSManagedObjectContext用にNSUndoManagerを割り当てる必要があります。

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 

見て、それを修正します。

これを行う最も簡単な方法は何かがNSManagedObjectContext

これは、Appleはあなたが与えるデフォルトの方法であるため、あなたのappDelegateを要求したときに元に戻すサポートを設定することですこのように:

- (NSManagedObjectContext *) managedObjectContext { 

    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 

     //Undo Support 
     NSUndoManager *anUndoManager = [[NSUndoManager alloc] init]; 
     [managedObjectContext setUndoManager:anUndoManager]; 
     [anUndoManager release]; 

     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 
    return managedObjectContext; 
} 
+0

おかげでベン+1、素敵な簡潔な答え –

+0

は、私は私のコードでアンドゥマネージャの作成や設定を持っていない、まだ元に戻すには、あたりの作品fectly。管理オブジェクトコンテキストにはすでに元に戻すマネージャがあります。必要なのは、ウィンドウ代理人に次のようなものを実装させるだけです。 ' - (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)ウィンドウ{ return [[DB managedObjectContext] undoManager]; } '。 –

+2

@IvanVučicaこれはOSXフレームワークで作業するときに当てはまりますが、iOSフレームワークで作業しているときにはNSWindowなどはなく、軽量化のために管理対象オブジェクトには元に戻すマネージャーが付いていません。 – Intentss

関連する問題