8

不久前,我编写了一个名为Day-O的简单日历菜单栏小部件。日历使用在添加到 NSStatusItem 的 NSMenu 中的 NSMenuItem 内的 NSView 内嵌套的股票 NSDatePicker。该应用程序的activationPolicy 为.accessory(最初通过plist 的“应用程序是代理”布尔设置)。在某些时候(可能是 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
}

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

4

1 回答 1

6

您的 NSDatePicker 需要将“acceptsFirstMouse”返回为 true,这是只读的,因此您将在子类中执行此操作。

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

于 2016-10-10T13:41:37.550 回答