2009-08-07 6 views
12

Ich versuche die Unterstützung rückgängig zu machen, die Core-Daten auf dem iPhone verwenden, und ich stieß auf ein paar Probleme.Rückgängigmachen der Verwaltung mit Core-Daten

Ich habe derzeit ein paar verwaltete Objekte eingerichtet, aber wenn ich Änderungen an ihren Eigenschaften mache, werden diese Änderungen nicht vom Undo-Manager aufgezeichnet. Meines Erachtens sollte Core Data dies automatisch einrichten und ich sollte in der Lage sein, grundlegende Änderungen rückgängig zu machen und wiederherzustellen, Änderungen zu erstellen und gelöschte Objekte zu löschen.

Gibt es eine spezielle Möglichkeit, Änderungen an den Objekten vorzunehmen, damit sie vom Undo Manager erfasst werden? Oder sollte ich Aktionen für jede Änderung rückgängig machen?

Angenommen, die Anwendung wird in eine Detailansicht verschoben, um ein bestimmtes Objekt zu bearbeiten. Ich möchte in der Lage sein, alle Änderungen rückgängig zu machen, wenn man sagt, dass der Abbrechen-Knopf gedrückt ist. Würde Gruppierung rückgängig machen hier anwendbar? Was ist der Unterschied zwischen der Übergabe einer Gruppe und einem anderen Undo-Manager, der die feineren Aktionen in der Detailansicht verwaltet, anstatt nur einen Undo-Manager zu verwenden (den, der zum Kontext des verwalteten Objekts gehört)?

Danke!

Antwort

24

Während die Undo-Funktionen weitgehend funktionieren, müssen Sie NSUndoManager für den NSManagedObjectContext zuweisen, für den Sie die Unterstützung rückgängig machen möchten.

Der einfachste Weg, dies zu tun ist, um die Undo-Unterstützung einzurichten, wenn etwas Ihre AppDelegate für die NSManagedObjectContext

Dies verlangt, ist die Standardmethode, die Apfel gibt Ihnen:

- (NSManagedObjectContext *) managedObjectContext { 

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

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

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

es ändern suchen dies wie:

- (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

Dank Ben +1, schöne prägnante Antwort –

+0

ich habe Erstellung oder Einstellung eines Undo-Manager nicht in meinem Code, noch Rückgängig Werke pro perfekt. Verwaltete Objektkontexte verfügen bereits über einen Undo-Manager. Alles, was Sie tun müssen, ist, dass ihr Fensterdelegat etwa Folgendes implementiert: '- (NSUndoManager *) windowWillReturnUndoManager: (NSWindow *) Fenster { return [[DB managedObjectContext] undoManager]; } '. –

+2

@ IvanVučica das stimmt bei der Arbeit mit den OSX-Frameworks, aber wenn Sie mit den iOS-Frameworks arbeiten gibt es keine NSWindow, und aus Gründen der geringen Gewicht, verwaltete Objekte kommen nicht mit einem Rückgängig-Manager. – Intentss

Verwandte Themen