Как я могу отменить удаление NSManagedObject без использования встроенного диспетчера отмены?

Я создаю приложение на основе документов OSX, используя CoreData и NSUndoManager.

У меня есть глобальный NSUndoManager, который обрабатывает Undoing и Redoing, вместо того, чтобы использовать тот, который по умолчанию встроен в каждый NSManagedDocument. Это означает, что я регистрирую отмены и повторения вручную, вместо того, чтобы полагаться на их автоматическую регистрацию при изменении контекста управляемого объекта.

Когда я удаляю NSManagedObject из NSManagedObjectContext, я хочу зарегистрировать отмену, которая восстанавливает удаленный объект. Я знаю, что это возможно, потому что встроенный NSUndoManager NSManagedDocument будет делать это по умолчанию, но попытка использовать объект после его удаления вызывает ошибку. Как я могу восстановить реальный объект во время отмены?

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

        // how to undelete object???

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

person Chase    schedule 13.06.2016    source источник


Ответы (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)
    })
}
person Chase    schedule 13.06.2016