NSStatusBar中的NSDatePicker NSSMenuItem没有接收输入



不久前,我写了一个简单的日历菜单栏小部件Day-O。日历使用stock NSDatePicker嵌套在NSView中的nssmenuitem中的nssmenu添加到NSStatusItem中。应用程序有一个.accessory的激活策略(最初通过plist的"应用程序是代理"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
}

启动应用程序,单击菜单项,并在日历周围单击。然后点击另一个应用程序,然后再次点击菜单项。日历不再响应点击

你的NSDatePicker需要返回"acceptsFirstMouse"为true,它是只读的,所以你要在子类中做这个。

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

相关内容

  • 没有找到相关文章

最新更新