不久前,我写了一个简单的日历菜单栏小部件,名为Day-O http://shauninman.com/archive/2011/10/20/day_o_mac_menu_bar_clock。日历使用嵌套在添加到 NSStatusItem 的 NSMenu 中的 NSMenuItem 内的 NSView 内的库存 NSDatePicker。该应用程序的activationPolicy为.accessory
(最初通过 plist 的“应用程序是代理”布尔值设置)。在某个时刻(也许是 El Capitan 更新?),日历停止响应输入。当应用程序首次启动时,您可以单击状态栏项目来展开菜单并与日历交互,它会按预期响应用户输入。但是,一旦应用程序失去初始焦点,日历就会停止响应输入。
我想我已经将问题归结为应用程序在最初退出活动后未激活。问题是,如果我尝试在单击菜单栏项时手动激活应用程序(使用NSApp.activate(ignoringOtherApps:true)
)菜单(您刚刚打开的)被关闭。
我还尝试告诉窗口使 NSDatePicker 成为第一响应者,但这似乎也没有任何效果。
当状态栏应用程序不是活动应用程序时,如何让菜单项中的 NSDatePicker 接受用户输入?
Edit:说明问题的最简单代码(将其添加到新 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,这是只读的,因此您将在子类中执行此操作。
在运行您提供的代码的测试项目中工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)