То, как я бы это сделал, - это, вероятно, считывание значения из пользовательских значений по умолчанию.
NSString * const MDAppleMiniaturizeOnDoubleClickKey = @"AppleMiniaturizeOnDoubleClick";
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// [userDefaults addSuiteNamed:NSGlobalDomain]; // unnecessary
NSNumber *miniaturize = [userDefaults
objectForKey:MDAppleMiniaturizeOnDoubleClickKey];
NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
([miniaturize boolValue] ? @"YES" : @"NO"));
(Этот параметр предпочтения хранится в невидимом .GlobalPreferences.plist
в папке ~ / Library / Preferences /).
Обратите внимание, что по умолчанию опция «двойной щелчок для минимизации» отключена, поэтому, если вы проверяете наличие AppleMiniaturizeOnDoubleClick
и он возвращает nil, это означает, что он выключен.(Пользовательские значения по умолчанию начинают сохранять значения, только если они отличаются от значений по умолчанию).
Этот ключ такой же в Leopard, как и в Snow Leopard.(Он не изменился ни в Lion, ни в Mountain Lion).
Конечно, в NSWindow
, -(BOOL)_shouldMiniaturizeOnDoubleClick
есть секретный (приватный) метод, но я бы не рекомендовал использовать приватные методы.
[ОБНОВЛЕНИЕ] Относительно комментария Catfish_Man: вы правы в том, что строка [userDefaults addSuiteNamed:NSGlobalDomain];
не нужна, поскольку NSUserDefaults уже имеет возможность читать глобальные настройки.(Я изменил приведенный выше код, чтобы отразить это).
"Кроме того, NSGlobalDomain
не переведен в .GlobalPreferences.plist для этого метода."
I 'Я не уверен, что следую за тобой там.NSUserDefaults построен на основе CFPreferences, который определяет следующие 6 констант:
Приложение:
kCFPreferencesAnyApplication,
kCFPreferencesCurrentApplication
Хост:
kCFPreferencesAnyHost,
kCFPreferencesCurrentHost
Пользователь:
kCFPreferencesAnyUser,
kCFPreferencesCurrentUser
С учетом вымышленного идентификатора пакета приложения "com.markdouma.App" и одного хоста (в зависимости от вашего текущего местоположения в сети, которое не изменится для этого примера), обычно есть 8 мест, где может храниться информация о предпочтениях.твой диск.(ПРИМЕЧАНИЕ. Указанные пути приведены только в демонстрационных целях; точные местоположения файлов могут быть изменены).8 различных местоположений возникают из-за различной комбинации констант CFPreferences:
/ Library / Preferences / .GlobalPreferences.plist (kCFPreferencesAnyApplication, kCFPreferencesAnyUser, kCFPreferencesAnyHost)
/Library/Preferences/com.markdouma.App.plist
(kCFPreferencesCurrentApplication, kCFPreferencesAnyUser,
kCFPreferencesAnyHost)
/ Библиотека / Предпочтения / ByHost / .GlobalPreferences.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesAnyApplication, kCFPreferencesAnyUser, kCFPreferencesCurrentHost)
/Библиотека / Настройки / ByHost / com.markdouma.App.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesCurrentApplication,
kCFPreferencesAnyUser, kCFPreferencesCurrentHost)
~ / Библиотека / Настройки / .GlobalPreferences.plist (kCFPreferencesAnyApplication, kCFPreferencesCurrentUser,
kCFPreferencesAnyHost)
~ / Library / Preferences / com.markdouma.App.plist (kCFPreferencesCurrentApplication, kCFPreferencesCurrentUser,
kCFPreferencesAnyHost)
~ / Library / Preferences / ByHost / .GlobalPreferences.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesAnyApplication,
kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
~ / Library / Preferences / ByHost / com.markdouma.App.UNIQUE_HOST_IDENTIFIER.plist (kCFPreferencesCurrentApplication,
kCFPreferencesCurrentUser, kCFPreferencesCurrentHost)
Хотя NSUserDefaults
может выполнять запись только в комбинацию доменов, выделенную курсивом, автоматически имеет доступ на чтение к комбинациям доменов, выделенным жирным шрифтом .Другими словами, без необходимости что-либо делать, я могу автоматически запустить следующий код и распечатать результаты:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSNumber *miniaturize = [userDefaults
objectForKey:@"AppleMiniaturizeOnDoubleClick"];
NSNumber *fastUserSwitching = [userDefaults
objectForKey:@"MultipleSessionEnabled"];
NSLog(@"AppleMiniaturizeOnDoubleClick == %@",
([miniaturize boolValue] ? @"YES" : @"NO"));
NSLog(@"MultipleSessionEnabled == %@",
([fastUserSwitching boolValue] ? @"YES" : @"NO"));
Запуск этого кода в моей системе выводит следующие результаты:
AppleMiniaturizeOnDoubleClick == YES
MultipleSessionEnabled == YES
Это имеет смысл, поскольку у меня есть быстрое переключение пользователей и двойной щелчок, чтобы минимизировать включенные параметры.MultipleSessionsEnabled
хранится в локальном домене в /Library/Preferences/.GlobalPreferences.plist
, а AppleMiniaturizeOnDoubleClick
хранится в пользовательском домене в ~/Library/Preferences/.GlobalPreferences.plist
.
Пример проекта: NSUserDefaultsFinagler.zip
"Кроме того, это медленно, пожалуйста. Не делайте этого."
Извините, но это не имеет смысла (если мы согласились, что мы больше неиспользуя addSuiteNamed:
).Пользовательские значения по умолчанию кэшируются приложением, поэтому вызовы занимают считанные миллисекунды.Не будет ли заметной разницы между запросом у пользователя по умолчанию значения для ключа, представляющего значение локального приложения, или ключа, представляющего глобальное значение?
AFAIK, это единственное «допустимое» (приложениесовместимый с магазином) способ достижения цели ОП.Если есть другое, более эффективное средство, пожалуйста, уточните.