2016-04-05 16 views
1

Ich habe eine kleine App mit Kerndaten und NSPersistentDocument. Bei neuen Dokumenten initialisiere ich das Dokument mit einem einzelnen Settings Element. Ich konnte den durch die Initialisierung erzeugten Rückgängig-Eintrag bereits unterdrücken, aber ...Probleme rückgängig machen: "NSPersistentDocument" programmatisch initialisieren ohne "editiert" -Flag in der Titelleiste

Das seltsame Verhalten ist dies: Das Dokument beginnt mit keinem "bearbeiteter" Flag im Fenstertitel. Sobald ich klicke, klicke ich in das "Bearbeiten" Menü, das "editierte" Flag erscheint und es ist plötzlich eine Rückgängig Aktion möglich.

Hier mein init() Code:

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 ... 
} 

Das Problem ist, sobald dieser Undo-Eintrag angezeigt wird, kann der Benutzer die Erstellung des ersten Settings Objekts rückgängig zu machen, die viele Probleme verursacht.

Ist dies ein bekanntes Problem? Wie kann ich verhindern, dass dies passiert?

Hier ist ein Video, das die Wirkung zeigt: https://youtu.be/O4lURxLAelE

Antwort

2

Anruf

[self.managedObjectContext processPendingChanges]; 

vor disableUndoRegistration und enableUndoRegistration.