2016-06-13 2 views
2

Je construis une application basée sur les documents OSX en utilisant CoreData et NSUndoManager.Comment annuler une suppression de NSManagedObject sans utiliser le gestionnaire d'annulation intégré?

J'ai un gestionnaire NSUndoManager global qui gère les fonctions Annuler et Refaire, au lieu d'utiliser celle qui est intégrée dans chaque NSManagedDocument. Cela signifie que j'inscris les undos et les redos manuellement, au lieu de me fier à eux pour être automatiquement enregistré quand le contexte d'objet géré change. Lorsque je supprime NSManagedObject du NSManagedObjectContext, je souhaite enregistrer une annulation qui restaure l'objet supprimé.

Je sais que c'est possible, parce que le NSUndoManager NSManagedDocument intégré le ferait par défaut, mais en essayant d'utiliser l'objet après qu'il ait été supprimé renvoie une erreur. Comment puis-je restaurer l'objet réel pendant l'annulation?

Répondre

1

Vous l'avez compris. La réponse facile:

self.project.undoManager?.insert(object) 

La partie délicate est, si vous avez enregistré le contexte de l'objet géré à un magasin persistant, toutes les propriétés de « objet » sont bouchés. Si vous enregistrez au préalable les valeurs de ces propriétés, vous pouvez les réaffecter après la nouvelle insertion.

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

avez-vous géré tout type de pile pour annuler les opérations de rétablissement –