1

切换到 mojave 后,我正在尝试在模式更改时调整菜单图标。我的应用程序:“应用程序是代理(UIElement)”最初没有窗口。

目前我正在使用 NSMenuDelegate 函数menuWillOpen,该函数到目前为止有效,但用户必须打开菜单才能更改图标。

我想知道是否有一种方法可以在不打开菜单的情况下检测到外观发生了变化。我已经从 NSApplicationDelegate 尝试了 applicationDidChangeScreenParameters ,但没有成功。

//这来自NSMenuDelegate

- (void)menuWillOpen:(NSMenu *)menu { 
    [self adaptToDarkMode];
}

// 这处理菜单图标的变化

 - (void) adaptMenuIcon {
    BOOL  darkModeFlag  = [self psGetDarkMode];
    NSString *iconName  = @"MenuIconBlack";

    if(darkModeFlag) {
        iconName  = @"MenuIconWhite";
    }

    NSString *filePath  = [self psBundlePathToFolder:@""];
    NSString *finalPath = [NSString stringWithFormat:@"%@%@.png", filePath, iconName];

    NSImage  *image     = [[NSImage alloc] initWithContentsOfFile:finalPath];
    pathToMenuIcons     = [self psBundlePathToFolder:@"MenuIcons"];

    [statusItem setMenu:statusMenu];
    [statusItem setTitle:@"➜"];
    [statusItem setImage: image];
    [statusItem setHighlightMode:YES];
}

主菜单

4

1 回答 1

0

您可以阅读全局首选项:

NSString *appearance = [[NSUserDefaults standardUserDefaults] stringForKey:@"AppleInterfaceStyle"];

这将Dark在黑暗模式下返回。

你也可以使用NSDistributedNotificationCenter

[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppearanceChanged:) name:@"AppleInterfaceThemeChangedNotification" object:nil]

-(void)onAppearanceChanged:(NSNotification *)notificaton
{
 // read appearance
}
于 2018-06-27T08:36:15.700 回答