2016-06-13 11 views
2

CoreData와 NSUndoManager를 사용하여 OSX 문서 기반 앱을 만들고 있습니다.내장 된 실행 취소 관리자를 사용하지 않고 어떻게 NSManagedObject 삭제를 실행 취소 할 수 있습니까?

각 NSManagedDocument에 기본 제공되는 기본 UI를 사용하는 대신 실행 취소 및 다시 실행을 처리하는 전역 NSUndoManager가 있습니다. 즉, 관리 객체 컨텍스트가 변경 될 때 자동으로 등록되도록 의존하지 않고 수동으로 재실행 및 재실행을 등록합니다.

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

실행 취소 다시 실행 작업을 위해 모든 종류의 스택을 관리 했습니까? –