不久前,我编写了一个名为日-O的简单日历菜单栏小部件。日历使用嵌套在NSDatePicker中的股票NSView,在添加到NSStatusItem的NSMenu中的NSMenuItem中。这个应用程序有一个activationPolicy of .accessory (最初是通过plist的"Application“bool设置的)。在某种程度上(也许是通过更新?)日历停止响应输入。当应用程序第一次启动时,您可以单击状态栏项来展开菜单并与日历进行交互,并按预期的方式响应用户的输入。但是,一旦应用程序失去初始焦点,日历就会停止响应输入。
我想我已经追踪到了这个应用程序,在最初退出active之后还没有激活。问题是,如果我尝试在单击菜单栏项目(使用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
}启动应用程序,单击菜单项,然后单击日历周围。然后单击另一个应用程序,然后再次单击菜单项。日历不再响应单击。
发布于 2016-10-10 13:41:37
您的NSDatePicker需要将"acceptsFirstMouse“返回为true,这是只读的,因此您将在子类中这样做。
在运行您提供的代码的测试项目中工作。
https://stackoverflow.com/questions/39944383
复制相似问题