1

我的 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 仍然是 yes/dark。

4

2 回答 2

2

您需要结合AppleInterfaceStylemacOS Catalina 中引入的这个新值 AppleInterfaceStyleSwitchesAutomatically

这是一些解释如何的伪代码:

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

您可以在此处查看 macOS 示例应用程序:https ://github.com/ruiaureliano/macOS-Appearance 。

干杯

于 2019-08-09T11:48:25.823 回答
1

在 macOS 中,查找当前有效外观(实际显示的内容)的最佳方法是查看NSApplication.effectiveAppearance。这个值可以通过 KVO 观察到,并且可以通过NSApp单例访问。一篇关于观察这些变化的好文章Supporting Dark Mode: Responding to Change涵盖了观察这个特定值。

macOS 的一般注意事项:从全局用户首选项中读取配置设置将为您提供上次存储的内容,但不会为您提供操作系统当前对该值的任何解释(如您在本示例中所示,可以随时间变化)。这就是你在这里遇到的。作为一般规则,如果您发现自己在阅读NSUserDefaultsAPI 中未定义的密钥,您应该四处寻找另一种方法。

于 2019-08-02T12:22:00.597 回答