Отмена управления с помощью основных данных - PullRequest
12 голосов
/ 07 августа 2009

Я пытаюсь реализовать поддержку отмены с помощью Core Data на iPhone, и я столкнулся с несколькими проблемами.

В настоящее время у меня настроена пара управляемых объектов, но когда я изменяю их свойства, эти изменения не записываются менеджером отмены. Насколько я понимаю, Core Data должен автоматически настраиваться, и у меня должна быть базовая поддержка отмены и восстановления изменений, создания и удаления управляемых объектов.

Есть ли особый способ внесения изменений в объекты, чтобы они записывались менеджером отмены? Или я должен регистрировать отмену действий для каждого изменения?

Кроме того, предположим, что приложение перемещается в подробный вид для редактирования определенного объекта. Я хотел бы иметь возможность отменить все сделанные изменения, когда, скажем, нажата кнопка отмены. Будет ли здесь отменена группировка? В чем разница между фиксацией группы и другим менеджером отмены, который управляет более точными действиями в детальном представлении по сравнению с использованием только одного менеджера отмены (того, который включен в контекст управляемого объекта)?

Спасибо!

1 Ответ

24 голосов
/ 15 декабря 2009

Хотя функции отмены будут работать практически из коробки, вам необходимо выделить NSUndoManager для NSManagedObjectContext, для которого требуется поддержка отмены.

Самый простой способ сделать это - настроить поддержку отмены, когда кто-то запрашивает у вашего appDelegate NSManagedObjectContext

Это метод по умолчанию, который дает вам яблоко:

- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];

        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return managedObjectContext;
}

Измените его так, чтобы он выглядел следующим образом:

- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        return managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];

        //Undo Support
        NSUndoManager *anUndoManager = [[NSUndoManager  alloc] init];
        [managedObjectContext setUndoManager:anUndoManager];
        [anUndoManager release];

        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return managedObjectContext;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...