NSStatusBar NSSMenuItem 中的 NSDatePicker 未接收输入
NSDatePicker in NSStatusBar NSSMenuItem not receiving input
不久前,我写了一个名为 Day-O 的简单日历菜单栏小部件。日历使用嵌套在 NSView 内的库存 NSDatePicker,NSView 内的 NSMenuItem 在添加到 NSStatusItem 的 NSMenu 中。该应用程序的 activationPolicy 为 .accessory
(最初通过 plist 的 "Application is agent" 布尔值设置)。在某些时候(也许是 El Capitan 更新?)日历停止响应输入。当应用程序首次启动时,您可以单击状态栏项目以展开菜单并与日历交互,它会按预期响应用户输入。但是一旦应用程序失去初始焦点,日历就会停止响应输入。
我想我已经将问题追溯到应用程序在最初退出活动后未激活。问题是,如果我在单击菜单栏项(使用 NSApp.activate(ignoringOtherApps:true)
)时尝试手动激活应用程序,菜单(您刚刚打开的)将被关闭。
我也试过告诉 window 让 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 需要 return "acceptsFirstMouse" 为真,这是只读的,因此您将在子类中执行此操作。
在测试项目中工作运行 您提供的代码。
不久前,我写了一个名为 Day-O 的简单日历菜单栏小部件。日历使用嵌套在 NSView 内的库存 NSDatePicker,NSView 内的 NSMenuItem 在添加到 NSStatusItem 的 NSMenu 中。该应用程序的 activationPolicy 为 .accessory
(最初通过 plist 的 "Application is agent" 布尔值设置)。在某些时候(也许是 El Capitan 更新?)日历停止响应输入。当应用程序首次启动时,您可以单击状态栏项目以展开菜单并与日历交互,它会按预期响应用户输入。但是一旦应用程序失去初始焦点,日历就会停止响应输入。
我想我已经将问题追溯到应用程序在最初退出活动后未激活。问题是,如果我在单击菜单栏项(使用 NSApp.activate(ignoringOtherApps:true)
)时尝试手动激活应用程序,菜单(您刚刚打开的)将被关闭。
我也试过告诉 window 让 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 需要 return "acceptsFirstMouse" 为真,这是只读的,因此您将在子类中执行此操作。
在测试项目中工作运行 您提供的代码。