Подтвердить что ты не робот

Отменить управление с помощью основных данных

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

В то время как функции отмены будут работать в значительной степени из коробки, вам необходимо выделить 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;
}