2010-03-10 2 views
1

У меня есть приложение на основе основных данных, которое поддерживает отмену/повторение через встроенный NSUndoManager, связанный с NSManagedObjectContext. У меня есть несколько действий, которые выполняют многочисленные задачи в Core Data, завершают все эти задачи в группу отмены через beginUndoGrouping/endUndoGrouping и обрабатываются NSUndoManager.NSUndoManager с базовыми данными - не работает

Undo хорошо работает. Я могу выполнить несколько последовательных действий, и каждый из них последовательно отменяет каждый из них, и состояние моего приложения поддерживается правильно. Однако пункт меню «Повторить» никогда не включается. Это означает, что NSUndoManager сообщает меню, что нет элементов для повтора.

Мне интересно, почему NSUndoManager, по-видимому, забывает о предметах, когда они отменяются, и не позволяет повторить?

Одна вещь, которую я должен упомянуть, это то, что я отключу отмену регистрации после открытия или создания документа. Когда я совершу действие, я звоню enableUndoRegistration, beginUndoGrouping, выполните действие, затем позвоните processPendingChanges, setActionName:, endUndoGrouping и, наконец, disableUndoRegistration. Это гарантирует, что только конкретные действия будут отменены, а любые другие изменения данных, которые я делаю вне их, остаются незамеченными NSUndoManager. Это может быть частью проблемы, но если это так, мне интересно, почему это влияет на повтор?

Заранее спасибо.

ответ

1

Я установил эту проблему:

Keeping отмену регистрации включен все время, в течение времени, когда я явно не хочу делать запись отмен за исключением.

я узнал, что:

Если вы включите отменить регистрацию только перед выполнением изменений, которые вы хотите записать, и отключить сразу после совершения этих изменений, стек Пересоединть NSUndoManager никогда не получает заселен.

Итак, никогда не звоните disableUndoRegistration.

3

Фактически, до тех пор, пока вы вызываете enableUndoRegistration перед обоими -undo и -redo (и disableUndoRegistration после них), вы можете добиться того, что было после.

Я считаю, что вы только вызывали функцию enable (/ disable) UndoRegistration до и после изменений в управляемых объектах. Это означает, что ваш «отменить» не был зарегистрирован менеджером отмены, и, следовательно, вы не смогли его переделать.

1

Я вызывал disableUndoManager, сохраняя включенную функцию «Повторить». Для этого я подклассы NSUndoManager и включил этот метод:

-(void) undo 
{ 
    [[appDelegate managedObjectContext] processPendingChanges]; 
    [self enableUndoRegistration]; 
    [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]]; 
    [super undo]; 
    [[appDelegate managedObjectContext] processPendingChanges]; 
    [self disableUndoRegistration]; 
} 

Как заявил Stefanf в NSUndoManager, Core Data and selective undo/redo: «NSUndoManager ждет следующего цикла цикла выполнения, пока он не регистрирует изменения»

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