J'ai bricolé avec Cocoa pendant quelques mois maintenant, et j'essaye d'ajouter le support d'annulation/rétablissement à une application de Cocoa strictement pour l'étude que j'écris qui vous permet d'ajuster des méta-données de piste d'iTunes. Merci à la méthode prepareWithInvocationTarget:
de NSUndoManager, j'ai les bases en place - vous pouvez annuler/refaire des changements aux compteurs de jeu et aux dates jouées dernières des morceaux choisis, par exemple. (J'utilise appscript-objc pour obtenir/définir les données de la piste iTunes.)Comment annuler une opération annuler/rétablir en cours?
Cependant, comme la mise à jour d'un grand nombre de pistes iTunes peut prendre un peu de temps, je voudrais donner à l'utilisateur la possibilité d'annuler une opération d'annulation/rétablissement pendant qu'il est en cours, mais je ne vois pas un mécanisme évident pour accomplir cela avec NSUndoManager. Comment ferais-je cela?
Edit:
Pour clarifier les choses, avoir pensé à ce sujet un peu plus, je suppose que ce que je suis vraiment après une façon de manipuler le undo/redo piles pour que j'éviter le « incohérent » que Rob Napier mentionne dans sa réponse. Ainsi, en réponse à une opération d'annulation qui a échoué sans apporter de modifications (par exemple, avant d'invoquer l'annulation, l'utilisateur avait ouvert la fenêtre Préférences d'iTunes, qui bloque les événements Apple), l'opération d'annulation pouvait rester en haut de la pile d'annulation, et la pile de rétablissement serait laissée inchangée. Si l'opération a été annulée ou a échoué à mi-chemin, alors je voudrais pousser sur la pile de rétablissement une opération qui inverse les changements qui ont traversé (le cas échéant) et qui a une opération qui applique les changements qui n'ont pas t réussir. Je suppose que le fait de scinder efficacement l'opération entre les piles d'annulation et de rétablissement pourrait susciter la confusion chez les utilisateurs, mais il semble que ce soit la façon la plus indulgente de régler le problème.
Je soupçonne que la réponse à ceci pourrait être l'un de "Écrire votre propre gestionnaire d'annulation", "Vos opérations d'annulation ne devraient pas être en mesure d'échouer" ou "Vous compliquez trop inutilement", mais je suis curieux . :)