Question

J'ai une application à base de document de données de base qui soutiennent undo / redo via le NSUndoManager intégré associé à la NSManagedObjectContext. J'ai quelques actions mises en place qui effectuent de nombreuses tâches dans les données de base, enveloppent toutes ces tâches dans un groupe undo via beginUndoGrouping / endUndoGrouping et sont traitées par le NSUndoManager.

Annuler fonctionne très bien. Je peux effectuer plusieurs actions successives, et chacun ensuite défaire chacun d'eux successivement et est maintenu correctement l'état de mon application. Cependant, l'élément de menu « Redo » est jamais activé. Cela signifie que le NSUndoManager est dit dans le menu qu'il n'y a aucun élément à refaire.

Je me demande pourquoi le NSUndoManager est apparemment Oubliant articles une fois qu'ils sont défaits, et ne permettant pas ODER de se produire?

Une chose que je devrais mentionner que je suis désactiver l'enregistrement après undo un document est ouvert / créé. Lorsque j'effectue une action, j'appelle enableUndoRegistration, beginUndoGrouping, effectuer l'action, puis appelez processPendingChanges, setActionName:, endUndoGrouping, et enfin disableUndoRegistration. Cela fait en sorte que seules les actions spécifiques peuvent être annulées, et toute autre modification de données que je fais en dehors de ceux-ci passent inaperçues au NSUndoManager. Cela peut être une partie de la question, mais si oui, je me demande pourquoi cela affecte redo?

Merci d'avance.

Était-ce utile?

La solution 2

J'ai résolu ce problème par:

Garder annuler l'enregistrement a permis à tous le temps, à l'exception des moments où je ne veux pas explicitement enregistrer undos.

J'ai appris que:

Si vous activez annuler l'enregistrement juste avant d'effectuer les modifications que vous souhaitez enregistrer, et désactiver immédiatement après avoir commis ces changements, la pile de rétablissement de NSUndoManager n'est jamais peuplée.

Alors, jamais appeler disableUndoRegistration.

Autres conseils

En fait, aussi longtemps que vous appelez enableUndoRegistration avant que les deux -undo et -redo (et disableUndoRegistration après eux), vous pouvez réaliser ce que vous étiez après.

Je crois que vous n'appelez activer (/ désactiver) UndoRegistration avant et après les modifications apportées à vos objets gérés. Cela signifie que votre « undo » n'a pas été enregistré auprès du gestionnaire d'annulation, et par conséquent vous ne pouvait pas « refaire » il.

J'ai appelé disableUndoManager tout en gardant « Refaire » activé. Pour ce faire, je NSUndoManager et sous-classé inclus cette méthode:

-(void) undo
{
  [[appDelegate managedObjectContext] processPendingChanges];
  [self enableUndoRegistration];
  [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode beforeDate:[NSDate date]];
  [super undo];
  [[appDelegate managedObjectContext] processPendingChanges];
  [self disableUndoRegistration];
}

Comme indiqué par stefanf NSUndoManager, données de base et sélective undo / redo : « NSUndoManager attend le prochain cycle de boucle d'exécution jusqu'à ce qu'il enregistre vos modifications »

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top