Désactiver le NSUndoManager pour certaine actions / certains objets

colas_colas_ Membre
janvier 2014 modifié dans Objective-C, Swift, C, C++ #1

Bonjour,


 


j'utilise CoreData. Je souhaiterais que le NSUndoManager n'annule pas la création/suppression de NSManagedObjects.


 


Savez-vous comment faire ?


 


Merci !


Réponses

  • Merci !


     


    J'ai essayé ceci



    - (void)awakeFromInsert
    {
        [super awakeFromInsert] ;
        
        [[self managedObjectContext] processPendingChanges];
        [[[self managedObjectContext] undoManager] removeAllActions];
    }

    mais ça ne marche pas. 


     


    Pour la suppression, je ne saurai pas comment faire car -prepareForDeletion est appelée avant la suppression.


     


    Je crois que je vais tout bonnement désactiver le UndoManager !


  • J'ai eu ce problème : je voulais que certaines modifications de mes données soient undoable et d'autres non.


     


    Ma solution : chainer un deuxième NSObjectManager au premier en déclarant nil son UndoManager. Ensuite lors de la création d'un NSManagedObject il suffit de s'adresser au bon NSObjectManager.


     


    Par contre il faut penser à  sauvegarder le deuxième NSObjectManager lorsque le premier est sauvegardé. Pour cela je mets en place une notification qui me permet de le faire automatiquement.


     


    Extrait de mon NSDocument.m



    - (void)windowControllerDidLoadNib:(NSWindowController *)aController
    {
    [super windowControllerDidLoadNib:aController];
    self.contexteLibre.persistentStoreCoordinator=self.managedObjectContext.persistentStoreCoordinator;
    self.contexteLibre.undoManager=nil;
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(uneSauvegardeAEuLieu:)
    name:NSManagedObjectContextWillSaveNotification
    object:self.managedObjectContext];
    }


    -(IBAction)uneSauvegardeAEuLieu:(id)sender {
    NSError *erreur;
    [self.contexteLibre save:&erreur];
    }

  • Merci @Fleurantin de ta réponse.


     


    Qu'entends-tu par NSObjectManager ? Je n'ai pas vraiment compris ta stratégie.


  • Pour être précis je parle de Manager pour le NSManagedObjectContext, celui du NSPersistentStore et celui ou ceux que je lui ajoute.


     


    Ma stratégie est la suivante :


     


    SI je crée un NSManagedObject pour lequel je veux pouvoir annuler des actions le concernant je le crée dans le NSManagedObjectContext ayant un NSUndoManager. (Par exemple des éléments graphiques de mon dessin.)


     


    SI je crée un NSManagedObject pour lequel je ne veux pas annuler des actions le concernant je le crée dans le NSManagedObjectContext n'ayant pas de NSUndoManager. (Par exemple les valeurs de position, taille de fenêtre, couleur en cours, calque en cours etc).


     


    Dans mon exemple contexteLibre est un NSManagedObject propriété de mon NSDocument et créé comme les autres au premier appel.


  • Super ! 


     


    Je m'en suis sorti en faisant : 



    - (id)init
    {
        self = [super init];
        
        if (self)
        {
            /*
             Suppression de la gestion du undo
             */
            [self.managedObjectContext setUndoManager:nil] ;   
        }

    (...)
    }

    Je précise que j'hérite de NSPersistentDocument et donc que le MOC est fourni automatiquement !


Connectez-vous ou Inscrivez-vous pour répondre.