我的Mac应用需要根据亮或暗模式更改行为。
在macOS Catalina中将外观选项选择为自动时,检测样式的最佳方法是什么?
NSDictionary *dict = [[NSUserDefaults standardUserDefaults] persistentDomainForName:NSGlobalDomain];
id style = [dict objectForKey:@"AppleInterfaceStyle"];
BOOL darkModeOn = ( style && [style isKindOfClass:[NSString class]] && NSOrderedSame == [style caseInsensitiveCompare:@"dark"] );
即使从黑暗外观切换为自动外观选项后,darkModeOn仍为是/黑暗。
答案 0 :(得分:1)
在macOS中,查找当前有效外观(实际显示的内容)的最佳方法是查看NSApplication.effectiveAppearance。该值可以用KVO观察到,并且可以通过NSApp
单例来访问。一篇不错的文章,介绍了如何观察这些Supporting Dark Mode: Responding to Change的变化,其中涉及到观察此特定值。
macOS的一般注意事项:从全局用户首选项中读取配置设置将为您提供上次存储的内容,但无法获得操作系统当前对该值的任何解释(正如您在本示例中所展示的那样)例如,可以随时间推移而变化)。这就是您在这里遇到的问题。通常,如果您发现自己在NSUserDefaults
中读取了API中未定义的键,则应该寻找另一种方法。
答案 1 :(得分:1)
您需要将AppleInterfaceStyleSwitchesAutomatically
与macOS Catalina theme = light //default is light
if macOS_10.15
if UserDefaults(AppleInterfaceStyleSwitchesAutomatically) == TRUE
if UserDefaults(AppleInterfaceStyle) == NIL
theme = dark // is nil, means it's dark and will switch in future to light
else
theme = light //means it's light and will switch in future to dark
endif
else
if UserDefaults(AppleInterfaceStyle) == NIL
theme = light
else
theme = dark
endif
endif
else if macOS_10.14
if UserDefaults(AppleInterfaceStyle) == NIL
theme = light
else
theme = dark
endif
endif
中引入的新值结合起来。
这是一些伪代码,说明如何:
struct someStruct {
char path[10][MAXPATHLEN];
};
您可以在以下位置查看macOS示例应用程序:https://github.com/ruiaureliano/macOS-Appearance。
干杯?