如何读取 Xcode 中 OS X 菜单栏的用户选择 (Swift)

How can I read the user selection for OS X menu bar in Xcode (Swift)

我正在 swift 中为 OS X 创建代理应用程序(仅在菜单栏中显示应用程序图标)。我正在使用以下方法从 AppDelegate 加载应用程序的图标:

 statusItem.image = NSImage(named: "BlackIcon")

而且效果很好。

但是,如果用户从“系统偏好设置”->“常规”中选择使用深色菜单栏,用户将看不到该图标,因为它是黑色的。

因此,如果用户选择了选项,我需要向他们显示不同的 'WhiteIcon'。

如何检查用户是否在我的应用程序中启用了此选项?

您似乎正在尝试为深色模式反转小菜单图标颜色。默认情况下 OSX 处理暗模式并反转图像颜色,但是您需要专门添加 [image setTemplate:YES] 才能为您工作,如果它还没有。

Objective-c:

self.statusItem = [[NSStatusBar systemStatusBar]     
statusItemWithLength:NSSquareStatusItemLength];
NSImage *image = [NSImage imageNamed:@"statusItemIcon"];
[image setTemplate:YES];
[self.statusItem setImage:image];

swift:(蔡志伟在下方link的回答)

var isDark = false

func isDarkMode() {
  // Swift2
  // isDark = NSAppearance.currentAppearance().name.hasPrefix("NSAppearanceNameVibrantDark") 

  // Swift3+
  isDark = NSAppearance.current.name.rawValue.hasPrefix("NSAppearanceNameVibrantDark") 
}

override func drawRect(dirtyRect: NSRect) {
super.drawRect(dirtyRect)
isDarkMode()
// Now use "isDark" to determine the drawing colour.
if isDark {
    // ...
 } else {
    // ...
 }
}

这个答案解释的很详细:NSStatusItem change image for dark tint

使用Swift 3.0,您可以使用UserDefaults访问macOS外观,或"AppleInterfaceStyle",使用以下代码:

let mode = UserDefaults.standard.string(forKey: "AppleInterfaceStyle")

如果用户启用了深色模式,则默认值为 return 字符串 "Dark"。如果他们启用了 "light mode",它将 return 为零。因此,您需要将其包装在以下代码中:

if UserDefaults.standard.string(forKey: "AppleInterfaceStyle") == "Dark" {
    statusItem.image = NSImage(named: "WhiteIcon")
} else {
    statusItem.image = NSImage(named: "BlackIcon")
}

我相信可能有更简洁的方法,也许有一个守卫,但这会让你到达 Swift 3.0

中你需要去的地方

编辑:

以上代码将确定用户当前 "mode"。但是,使用简单的用户首选项检查不会导致正确的行为(例如,它只会在应用程序启动时触发)。

正确的执行方法是将菜单图标设置为黑色图标。然后,浏览到资产目录中的资产,然后 select 菜单图标。使用菜单 selected,浏览到属性检查器并确保使用“Mac”设备检查图像。然后选择“渲染为”设置为“模板图像”。

这只需要你有一个黑色图标,macOS 会处理图像从暗模式到亮模式的转换。