2016-04-05 2 views
1

У меня есть небольшое приложение, использующее данные ядра и NSPersistentDocument. Для новых документов я инициализирую документ одним элементом Settings. Я уже мог подавить запись отмены, сгенерированную инициализацией, но ...Undo troubles: Инициализировать `NSPersistentDocument` программно без« отредактированного »флага в строке заголовка

странное поведение: Документ начинается без «отредактированного» флага в заголовке окна. Как только я нажимаю в меню «Редактировать», появляется «отредактированный» флаг, и внезапно может быть отменено действие.

Вот мой init() код:

class Document: NSPersistentDocument { 
    var settings: Settings! = nil 
    override init() { 
     super.init() 
     do { 
      let fetchSettings = NSFetchRequest(entityName: "Settings") 
      let settingsList = try self.managedObjectContext!.executeFetchRequest(fetchSettings) 
      precondition(settingsList.count < 2, "Too many settings object in the core data store.") 
      if settingsList.count == 1 { 
       settings = settingsList[0] as? Settings 
       precondition(settings != nil) 
      } else { 
       managedObjectContext!.undoManager!.disableUndoRegistration() 
       settings = NSEntityDescription.insertNewObjectForEntityForName("Settings", inManagedObjectContext: self.managedObjectContext!) as? Settings 
       precondition(settings != nil) 
       // Here setup the "settings" object... 
       settings.xxx = //... 
       settings.yyy = //... 
       managedObjectContext!.undoManager!.enableUndoRegistration() 
      } 
     } catch { 
      preconditionFailure("Could not retrieve/create settings object because of an unknown core data error.") 
     } 
    } 
    // ... more methods ... 
} 

Проблема заключается в том, как только появляется эта запись отмены, пользователь может отменить создание первоначального Settings объекта, который вызывает много проблем.

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

Вот видео, которое демонстрирует эффект: https://youtu.be/O4lURxLAelE

ответ

2

Вызов

[self.managedObjectContext processPendingChanges]; 

перед тем disableUndoRegistration и enableUndoRegistration.

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