NSStatusBar中的NSDatePicker NSSMenuItem未接收输入

Sha*_*man 8 macos cocoa nsstatusitem nsdatepicker swift

前段时间我写了一个名为Day-O的简单日历菜单栏小部件.日历使用嵌套在NSMenuItem中的NSView内部的NSDatePicker库存添加到NSStatusItem中的NSMenu中.该应用程序有一个activationPolicy .accessory(最初通过plist的"Application is agent"bool设置).在某些时候(可能是El Capitan更新?)日历停止响应输入.当应用程序首次启动时,您可以单击状态栏项以展开菜单并与日历交互,并按预期响应用户输入.但是一旦应用程序失去了初始焦点,日历就会停止响应输入.

我认为我已经跟踪了问题,直到最初辞职活动后应用程序未激活.问题是,如果我在单击菜单栏项目时尝试手动激活应用程序(使用NSApp.activate(ignoringOtherApps:true)),则菜单(您刚刚打开)将被解除.

我也试过告诉窗口让NSDatePicker成为第一个响应者,但这似乎也没有任何效果.

当状态栏应用程序不是活动应用程序时,如何在菜单项中获取NSDatePicker以接受用户输入?


编辑:最简单的代码来说明问题(在新的macOS Cocoa应用程序中将其添加到AppDelegate):

let statusItem = NSStatusBar.system().statusItem(withLength:NSVariableStatusItemLength)
func applicationDidFinishLaunching(_ aNotification: Notification) {
    NSApp.setActivationPolicy(.accessory)

    statusItem.button?.title = "Calendar"

    let menu = NSMenu()
    let item = NSMenuItem()
    let picker = NSDatePicker(frame: NSRect(x: 0, y: 0, width: 140, height: 148))
    picker.datePickerStyle = .clockAndCalendarDatePickerStyle

    item.view = picker
    menu.addItem(item)

    statusItem.menu = menu
}
Run Code Online (Sandbox Code Playgroud)

启动应用程序,单击菜单项,然后单击日历.然后单击另一个应用程序,然后再次单击菜单项.日历不再响应点击次数.

小智 5

您的NSDatePicker需要将"acceptsFirstMouse"返回为true,这是readonly,因此您将在子类中执行此操作.

在运行您提供的代码的测试项目中工作.