2016-06-13 7 views
2

Ich erstelle eine dokumentenbasierte OSX-App mit CoreData und NSUndoManager.Wie kann ich eine NSManagedObject-Löschung rückgängig machen, ohne den integrierten Undo-Manager zu verwenden?

Ich habe einen globalen NSUndoManager, der das Rückgängigmachen und Wiederherstellen behandelt, anstatt den Standard zu verwenden, der in jedem NSManagedDocument integriert ist. Das bedeutet, dass ich die Undos und Redos manuell registriere, anstatt darauf zu vertrauen, dass sie automatisch registriert werden, wenn sich der Kontext des verwalteten Objekts ändert.

Wenn ich das NSManagedObject aus dem NSManagedObjectContext lösche, möchte ich ein Rückgängigmachen registrieren, das das gelöschte Objekt wiederherstellt. Ich weiß, dass dies möglich ist, weil das integrierte NSUndoManager von NSManagedDocument dies standardmäßig tun würde. Wenn Sie jedoch versuchen, das Objekt nach dem Löschen zu verwenden, wird ein Fehler ausgegeben. Wie kann ich das tatsächliche Objekt während des Rückgängigmachens wiederherstellen?

Antwort

1

Haben Sie es herausgefunden. Die einfache Antwort:

self.project.undoManager?.insert(object) 

Der schwierige Teil ist, wenn Sie den verwaltete Objektkontext zu einem persistenten Speicher gespeichert haben, alle Eigenschaften von „Objekt“ wird ausgeblendet. Wenn Sie die Werte dieser Eigenschaften jedoch zuvor speichern, können Sie sie nach dem Einfügen neu zuweisen.

func removeAnObject(object: NSManagedObject) { 

    let property1 = object.property1 
    let property2 = object.property2 

    self.managedObjectContext?.deleteObject(object) 
    self.project?.undoManager?.registerUndoWithTarget(self, handler: { (object) in 

     self.managedObjectContext?.insertObject(object) 
     object.property1 = property1 
     object.property2 = property2 

     self.project?.undoManager?.prepareWithInvocationTarget(self).removeAnObject(object) 
    }) 
} 
+0

haben Sie einen Stapel für Redo-Operationen rückgängig gemacht –

Verwandte Themen