2011-12-25 4 views
5

Sto cambiando la preferenza .GlobalPreferences NSUserSubstitution tramite la classe NSUserDefaults (tramite PyObjC, ma questo è oltre il punto).Come faccio a segnalare ad altre app Cocoa che le preferenze sono state cambiate?

Questa preferenza controlla le sostituzioni di testo presentano (per esempio che può sostituire "©" per "(c)") di OS X.

Dopo aver modificato la preferenza, lo voglio applicare immediatamente in tutte le applicazioni in esecuzione. Quando viene modificato tramite le Preferenze di Sistema, si applica immediatamente. Come dovrei segnalare ad altre app di applicarlo immediatamente?

Aggiornamento: Ecco il progetto: https://github.com/ikonst/mac-tex-substitutions

+1

Potrebbe non esserci un modo per. 'NSUserDefaults' [utilizza una cache per-app] (http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/UserDefaults/AccessingPreferenceValues/AccessingPreferenceValues.html#//apple_ref/doc/uid/10000059i- CH3-97569) che viene aggiornato periodicamente. La tua app può richiedere la sincronizzazione immediata per se stessa, ma a meno che le altre app non si siano registrate per agire su "NSUserDefaultsDidChangeNotification", probabilmente attenderanno solo la sincronizzazione automatica. Potrei aver perso qualcosa, comunque. –

+0

L'avrei pensato, se le Preferenze di Sistema non fossero riuscite a candidarsi immediatamente, ma gestiva ... quindi deve esserci un modo! – Ilya

+0

Hmm, buon punto. –

risposta

2

utilizzando il seguente codice:

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

ho potuto rilevare che i posti di applicazione Preferenze di Sistema una notifica di nome NSUserReplacementItemsEnabledChanged quando il cambiamento delle preferenze sostituzioni di testo .

Sapendo che, è ora possibile inviare la notifica adeguata dopo aver modificato le preferenze di far conoscere tutte le applicazioni aperte:

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


tenere a mente che NSUserReplacementItemsEnabledChanged non è documentato da nessuna parte, in modo da questo comportamento può cambiare in qualsiasi momento.

+0

Grazie. A proposito, questa è la notifica per abilitare e disabilitare la funzione. La notifica per la modifica dell'elenco è "NSSpellServerReplacementsChanged". – Ilya

+0

Felice di aver aiutato, e grazie per la cattura :) – Guillaume

+0

Hey Guillaume! Ho modificato le impostazioni del proxy di rete e ho utilizzato il codice sopra per ascoltare le notifiche che sono state attivate e non ne ho trovato. Sai quale potrebbe essere la ragione. Ho una domanda aperta qui https://stackoverflow.com/questions/36210701/notification-that-tells-the-system-that-preferences-plist-has-changed – brumbrum