2009-11-13 8 views
2

J'ai une simple application Core Data qui affiche une liste d'entités dans la fenêtre principale. Pour créer ou ajouter de nouvelles entités, j'utilise une deuxième fenêtre modale avec un contexte d'objet géré distinct afin que les modifications puissent être annulées/refaites sans interférer avec le contexte d'objet géré principal.NSUndoManager et runModalForWindow:

La fenêtre d'édition est lancée à l'aide de runModalForWindow:. Si je fais une série de changements discrets dans cette fenêtre modale, faire une seule annulation annule TOUT mes changements. J'ai essayé de définir les modes de boucle d'exécution de NSUndoManager (obtenus à partir du deuxième contexte d'objet géré) pour contenir NSModalPanelRunLoopMode mais cela ne semblait pas faire de différence.

Si je ne lance pas la fenêtre en utilisant runModalForWindow: et que j'utilise simplement makeKeyAndOrderFront:, tout fonctionne comme prévu.

Quelqu'un at-il déjà rencontré cela?

Kevin

+0

Je ne comprends pas pourquoi vous voulez deux contextes. Voulez-vous deux piles d'annulation? Quand vous écrivez "une seule annulation ..." quelle pile annulez-vous, le contexte de la fenêtre d'origine ou modale? – paulmelnikow

Répondre

0

Utilisez-vous par hasard le kit d'application Cocoa pour votre application? Je ne sais pas pourquoi il ne serait pas le faire sur votre fenêtre principale, et seulement sur la superposition .. mais cela pourrait être dans la bonne direction ..

La citation suivante est de la Mac Dev Center, NSUndoManager Class Reference:

Lorsque effectuer une annulation d'un NSUndoManager enregistre les opérations restaurées afin que vous pouvez refaire les annulations. Si elle est utilisée dans une application Kit-application à base de cacao , les groupes NSUndoManager toutes opérations dans un seul cycle de la boucle d'exécution, de sorte que l'exécution d'une undo reprend tous les changements survenus au cours du cycle.

+0

Merci pour la réponse. J'effectue plusieurs actions indépendamment sur la deuxième fenêtre modale. En tant que tel, chaque événement est géré dans un cycle différent de la boucle d'exécution. Comme je l'ai mentionné dans le post original, cela fonctionne très bien si j'utilise makeKeyAndOrderFront :. – damacster

Questions connexes