2009-10-20 6 views
0
- (void)cancel { 
// [managedObjectContext.undoManager disableUndoRegistration]; 
    [managedObjectContext deleteObject:object]; // I don't want this deletion to be recorded on the undo stack which is empty at this point. 
// [managedObjectContext.undoManager enableUndoRegistration]; 
    [managedObjectContext.undoManager removeAllActions]; 
} 

Avec ce code, j'ai toujours la suppression sur la pile d'annulation, même en décommentant ces deux lignes ne peut pas empêcher l'enregistrement. Pourquoi?Pourquoi ce code ne parvient pas à vider la pile d'annulation

Répondre

2

Vous devez appeler -processPendingChanges sur le contexte d'objet géré avant de le désactiver et avant de réactiver le traitement d'annulation. Les données de base retardent l'enregistrement des événements d'annulation jusqu'à ce que processPendingChanges permette la fusion de plusieurs modifications au même attribut et aux raccourcis similaires.

0

Qu'est-ce qui appelle -cancel? J'ai rencontré des situations où une autre méthode enregistrait un événement d'annulation (et les données de base peuvent le faire "utilement" pour vous). Vous pouvez constater que votre pile d'annulation est vide à la fin de -cancel mais obtient un événement ajouté par la méthode d'appel. Dans ces cas, choisir "Annuler" ne fait rien, l'événement n'a rien à annuler. Pour éviter ces événements superflus, vous devez désactiver l'annulation de l'enregistrement (puis le réactiver) dans la méthode d'appel. Quelque chose le long des lignes de ...

- (void)doSomething { 
    // Disable undo until we definitely want to undo stuff 
    [managedObjectContext.undoManager disableUndoRegistration]; 

    // Stuff goes here 

    if (userCancelled) { 
     [self cancel]; 
     [managedObjectContext.undoManager enableUndoRegistration]; 
     return; 
    } 

    // We actually want user to be able to undo the following stuff 
    [managedObjectContext.undoManager enableUndoRegistration]; 

    // More stuff goes here 
} 

Avant de plonger trop loin dans ce faire quelques vérifications NSLog simple pour voir ce qui est sur la pile undo quand (et pour vous assurer que vous envoyez des messages à un réel NSUndoManager en direct plutôt qu'un objet nul).

+0

1. Un bouton déclenche -cancel. 2. Comment puis-je savoir si la pile d'annulation est vide sauf pour essayer de faire une annulation? Cette information est encapsulée, donc je ne peux pas me connecter. 3. Mon "Annuler" déclenche une action qui annule ma suppression. 4. gestionnaire d'annulation de zéro? Oh non, bien sûr. Mais merci pour le rappel. – an0

Questions connexes