2009-08-07 2 views
12

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

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

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

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

Спасибо!

ответ

24

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

Благодаря Бен +1, прекрасный сжатый ответ –

+0

Я не создание или настройки менеджера отмены в моем коде, но Отменить работы за fectly. Контексты управляемых объектов уже имеют диспетчер отмены. Все, что нужно сделать, это заставить их делегат окна реализовать что-то вроде этого: '- (NSUndoManager *) windowWillReturnUndoManager: (NSWindow *) window { return [[DB managedObjectContext] undoManager]; } '. –

+2

@ IvanVučica это правда при работе с фреймворками OSX, однако, когда вы работаете с фреймворками iOS, нет такой вещи, как NSWindow, и для облегченных причин управляемые объекты не поставляются с менеджером отмены. – Intentss

Смежные вопросы