2011-12-25 5 views
5

Estoy cambiando la preferencia .GlobalPreferences NSUserSubstitutions a través de la clase NSUserDefaults (a través de PyObjC, pero eso es además del punto).¿Cómo señalo a otras aplicaciones de Cocoa que se cambiaron las preferencias?

Esta preferencia controla la función de sustituciones de texto (por ejemplo, que puede sustituir "©" para "(c)") de OS X.

Después de cambiar la preferencia, quiero que se aplica inmediatamente en todas las aplicaciones en ejecución. Cuando se cambia a través de las Preferencias del sistema, se aplica de inmediato. ¿Cómo debería indicarle a otras aplicaciones que lo apliquen de inmediato?

Actualización: Aquí está el proyecto: https://github.com/ikonst/mac-tex-substitutions

+1

Puede que no haya una forma de hacerlo. 'NSUserDefaults' [utiliza un caché por aplicación] (http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/UserDefaults/AccessingPreferenceValues/AccessingPreferenceValues.html#//apple_ref/doc/uid/10000059i- CH3-97569) que se actualiza periódicamente. Su aplicación puede solicitar la sincronización inmediata por sí misma, pero a menos que las otras aplicaciones se hayan registrado para actuar en 'NSUserDefaultsDidChangeNotification', probablemente solo esperarán la sincronización automática. Sin embargo, puede haberme perdido algo. –

+0

Pensé que sí, si las Preferencias del Sistema no lograron aplicarse de inmediato, pero sí lo hace ... ¡así que debe haber una forma! – Ilya

+0

Hmm, buen punto. –

Respuesta

2

Usando el siguiente código:

[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(gotIt:) name:nil object:nil]; 

pude detectar que los mensajes de la aplicación Preferencias del sistema una notificación nombrado NSUserReplacementItemsEnabledChanged cuando el cambio sustituciones de texto preferencias .

Sabiendo que, ahora se puede publicar la notificación adecuada después de cambiar las preferencias para dar a conocer todas las aplicaciones abiertas:

[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"NSUserReplacementItemsEnabledChanged" object:self]; 


tener en cuenta que NSUserReplacementItemsEnabledChanged no está documentada en cualquier lugar, por lo que este comportamiento puede cambiar en cualquier momento.

+0

Gracias. Por cierto, esta es la notificación para habilitar y deshabilitar la función. La notificación para cambiar la lista es "NSSpellServerReplacementsChanged". – Ilya

+0

Me alegro de haber ayudado, y gracias por la captura :) – Guillaume

+0

¡Hola Guillaume! Cambié la configuración del proxy de red y usé el código anterior para escuchar las notificaciones que se activaron y no encontré ninguna. ¿Sabes cuál podría ser el motivo? Tengo una pregunta abierta aquí https://stackoverflow.com/questions/36210701/notification-that-tells-the-system-that-preferences-plist-has-changed – brumbrum

Cuestiones relacionadas