2010-08-13 25 views
7

En la interfaz de mi aplicación iOS tengo deshacer explícita & botón rehacer (shake-to-undo es una acción bastante pesada y en este contexto, los cambios se realizan con bastante frecuencia). Normalmente, utilizaría KVO para observar las rutas de acceso canUndo y canRedo de NSUndoManager y habilitar & para desactivar los botones a medida que entren las notificaciones. Desafortunadamente, NSUndoManager no parece ser compatible con KVO para esas rutas clave, o al menos, I ' No veo nada en términos de notificaciones.NSUndoManager y habilitar/deshabilitar un botón deshacer

Entonces mi pregunta es: ¿Cómo hago que funcione? ¿Lo estoy haciendo mal con KVO? (Tengo doble & comprobado triple pero siempre hay esa posibilidad). ¿Hay alguna otra forma de hacer esto en la que no estoy pensando? (He pensado simplemente en comprobar el valor de -canUndo cada vez que el runloop gira, pero eso tiene un tipo de mal olor de código para mí).

(Tenga en cuenta que es muy posible que NSUndoManager es diferente a la de iOS y Mac OS X, por lo que no creo "Funciona en Mac" va a ser una respuesta adecuada, en este caso)

Respuesta

12

Regístrese para NSUndoManagerDidUndoChangeNotification de NSUndoManager y sus amigos para examinar cuándo se crean nuevos grupos de deshacer y cómo se extrajeron de la pila y cómo se actualizan correctamente los estados de sus botones.

+3

Impresionante - NSUndoManagerWillCloseUndoGroupNotification es el que me había perdido anteriormente. Todo tiene sentido ahora. Gracias @aclark. –

+1

Un último seguimiento: Todo funcionó a la perfección. –

+0

La documentación dice: "Publicado antes de que un objeto' NSUndoManager' cierre un grupo deshacer, que ocurre en la implementación del método 'endUndoGrouping'". Sin embargo, puedo confirmar que se publique cuando registra un deshacer único (por ejemplo, con '-registerUndoWithTarget: selector: object:'). Muy útil para llamar a 'canUndo' en' notification.object' ('NSUndoManager') y activar/desactivar cualquier botón de" deshacer "en la interfaz de usuario. –