如何让动态 NSMenu 使用 Mojave 黑暗模式?

How to get dynamic NSMenu to use Mojave Dark Mode?

我的 OS 设置为深色模式,我的整个应用程序正确呈现,除了一些动态创建的 NSMenu 实例,它们以旧的浅色样式呈现。

如何让这些菜单使用深色视觉样式呈现?

深色视觉样式仅在您指定父视图时应用。

这里如果viewnil,将使用旧的样式:

NSMenu* menu;
NSView* view; // cannot be nil
[menu popUpMenuPositioningItem:nil atLocation:NSMakePoint(0, 0) inView:view];

popUpMenuPositioningItem 有一个未记录的 apperance 参数。您必须自定义现有的 NSMenu class 才能使用它:

@interface NSMenu ()
- (BOOL)popUpMenuPositioningItem:(nullable NSMenuItem *)item atLocation:(NSPoint)location inView:(nullable NSView *)view appearance:(nullable NSAppearance *)appearance NS_AVAILABLE_MAC(10_6);
@end

如果您想通过 popUp 在 Swift 中使用它,您必须在 "Objective-C Bridging Header" 文件中声明它并将路径添加到 Xcode 项目的构建设置在 "Swift Compiler - General"

之下

我找到了这个解决方案 here and here. Class extension is documented here