2016-06-13 83 views
2

我正在構建一個使用CoreData和NSUndoManager的基於OSX文檔的應用程序。如何在不使用內置撤銷管理器的情況下撤銷NSManagedObject刪除?

我有一個全局的NSUndoManager處理撤消和重做,而不是使用每個NSManagedDocument內置的默認值。這意味着我手動註冊了撤銷和重做,而不是在託管對象上下文更改時依賴它們自動註冊。

當我從NSManagedObjectContext中刪除NSManagedObject時,我想要註冊一個撤消操作來恢復已刪除的對象。我知道這是可能的,因爲NSManagedDocument的內置NSUndoManager默認會這樣做,但在刪除對象後嘗試使用該對象會引發錯誤。如何在撤消過程中恢復實際對象?

回答

1

明白了。最簡單的答案:

self.project.undoManager?.insert(object) 

棘手的部分是,如果你已經保存了管理對象範圍內的持久性存儲,所有的「對象」的屬性的消隱。但是,如果事先保存這些屬性的值,則可以在新插入後重新指定它們的值。

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

您是否管理過任何一種用於撤消重做操作的堆棧 –