带macOS Mojave暗模式的NSPopover背景色(包括三角形)

带macOS Mojave暗模式的NSPopover背景色(包括三角形),macos,cocoa,appkit,nspopover,macos-mojave,Macos,Cocoa,Appkit,Nspopover,Macos Mojave,Swift 4.2、Xcode 10、macOS 10.14 我已经创建了下面的NSView子类,我将它放在故事板中所有nspover实例的根视图上。但我注意到,当我在macOS Mojave中切换颜色模式时(从暗到亮或相反),它不会更新我的nspover的背景色 class PopoverMain:NSView{ override func viewDidMoveToWindow() { guard let frameView = window?.contentView?.supe

Swift 4.2、Xcode 10、macOS 10.14

我已经创建了下面的
NSView
子类,我将它放在故事板中所有
nspover
实例的根视图上。但我注意到,当我在macOS Mojave中切换颜色模式时(从暗到亮或相反),它不会更新我的
nspover
的背景色

class PopoverMain:NSView{
  override func viewDidMoveToWindow() {
    guard let frameView = window?.contentView?.superview else { return }

    let backgroundView = NSView(frame: frameView.bounds)
    backgroundView.backgroundColor(color: Color(named: "MyColor")!)
    backgroundView.autoresizingMask = [.width, .height]

    frameView.addSubview(backgroundView, positioned: .below, relativeTo: frameView)
  }
}
我相信这是因为颜色模式转换只调用这些方法(),而不调用viewdimovetowindow():

  • updateLayer()
  • draw(:)
  • layout()
  • updateConstraints()

有没有人想出一种可靠的方法来给
nspover
(包括它的三角形)的背景上色,并让它在macOS Mojave上无缝工作?

很有趣的是,写下你的问题会导致一个解决方案(有时很快)。我意识到我需要创建另一个
NSView
子类,负责生成加载到
nspover
中的
NSView
。注意添加了
PopoverMainView
类:

class PopoverMain:NSView{
  override func viewDidMoveToWindow() {
    guard let frameView = window?.contentView?.superview else { return }

    let backgroundView = PopoverMainView(frame: frameView.bounds)
    backgroundView.autoresizingMask = [.width, .height]
    frameView.addSubview(backgroundView, positioned: .below, relativeTo: frameView)
  }
}

class PopoverMainView:NSView {
  override func draw(_ dirtyRect: NSRect) {
    Color(named: "MyColor")!.set()
    self.bounds.fill()
  }
}

仅仅扩展
PopoverMain
updateLayer()
的方法,并按照您链接的Apple Doc源代码中的建议在内部设置
backgroundView.backgroundColor(color:color(名为:“MyColor”)!
难道不可行吗?当在appdelegate中声明pover时,您将如何使用它:let poover=nspover()?