2010-08-13 20 views
7

Dans l'interface de mon application iOS, j'ai explicitement & pour annuler le bouton redo (shake-to-undo est une action assez lourde et dans ce contexte, les annulations sont effectuées assez fréquemment). Normalement, j'utiliserais KVO pour observer les chemins de clé canUndo et canRedo de NSUndoManager et activerais & pour désactiver les boutons à mesure que les notifications arrivent. Malheureusement, NSUndoManager ne semble pas être compatible avec KVO pour ces chemins clés - ou au moins, je ' Je ne vois rien en termes de notifications.NSUndoManager et activer/désactiver un bouton d'annulation

Donc, ma question est: Comment puis-je obtenir ce fonctionnement? Est-ce que je me trompe avec le KVO? (J'ai double & triple vérifié mais il y a toujours cette possibilité). Y a-t-il une autre façon de le faire à laquelle je ne pense pas? (J'ai juste à propos de vérifier la valeur de -canUndo à chaque fois que le runloop tourne mais ça a une mauvaise odeur de code pour moi).

(Notez qu'il est tout à fait possible que NSUndoManager est différent sur l'iOS et Mac OS X, donc je ne pense pas « Il fonctionne sur le Mac » va être une réponse utile, dans ce cas)

Répondre

12

Inscrivez-vous à NSUndoManagerDidUndoChangeNotification de votre NSUndoManager et à vos amis pour examiner quand de nouveaux groupes d'annulation sont créés et sortis de la pile et mettez à jour les états de votre bouton de manière appropriée.

+3

Awesome - NSUndoManagerWillCloseUndoGroupNotification est celui que j'avais manqué précédemment. Tout a un sens maintenant. Merci @aclark. –

+1

Un dernier suivi: Tout a parfaitement fonctionné. –

+0

La documentation dit: "Posté avant qu'un objet' NSUndoManager' ferme un groupe d'annulation, qui se produit dans l'implémentation de la méthode 'endUndoGrouping'.". Cependant, je peux confirmer qu'il est publié lorsque vous enregistrez une seule annulation (par exemple avec '-registerUndoWithTarget: selector: object:'). Très utile pour appeler 'canUndo' sur' notification.object' ('NSUndoManager') et activer/désactiver n'importe quel bouton" annuler "dans l'interface utilisateur. –