2016-04-05 1 views
1

J'ai une petite application utilisant les données de base et NSPersistentDocument. Pour les nouveaux documents, j'initialise le document avec un seul élément Settings. Je pourrais déjà supprimer l'entrée d'annulation générée par l'initialisation, mais ...Problèmes d'annulation: Initialiser `NSPersistentDocument` par programmation sans indicateur" edited "dans la barre de titre

Le étrange comportement est la suivante: Le document commence par aucun drapeau "édité" dans le titre de la fenêtre. Dès que je clique dans le menu "Edition", le drapeau "édité" apparaît et il y a soudainement une action d'annulation possible.

Voici mon code 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 ... 
} 

Le problème est, dès cette entrée undo apparaît, l'utilisateur peut annuler la création de l'objet initial Settings qui provoque de nombreux problèmes.

Est-ce un problème connu? Comment puis-je empêcher cela?

Voici une vidéo qui montre l'effet: https://youtu.be/O4lURxLAelE

Répondre

2

Appel

[self.managedObjectContext processPendingChanges]; 

avant disableUndoRegistration et enableUndoRegistration.