我使用 Swift 为 Mac OS 创建了一个菜单应用程序,其中自定义视图是唯一的菜单项。此自定义视图上有一个加号按钮,用于打开一个包含文本字段的窗口。
当我单击加号按钮时,窗口出现,但菜单不会消失。文本字段也没有焦点。当我键入一个字母时,该字母不会显示在文本字段中,但菜单消失,并且文本字段已聚焦并准备好接收条目。
我想让自定义视图或菜单消失,并在单击加号按钮时(而不是在按额外的键(时准备好接收击键的文本字段。
我怎样才能做到这一点?我做错了什么?
这是我的代码:
// CustomView.swift
var customWindow: CustomWindow!
override func awakeFromNib() {
customWindow = CustomWindow()
}
@IBAction func plusButtonClicked(_ sender: NSButton) {
customWindow.showWindow(nil)
}
// CustomWindow.swift
override var windowNibName : NSNib.Name? {
return NSNib.Name("CustomWindow")
}
override func windowDidLoad() {
super.windowDidLoad()
self.window?.center()
self.window?.makeKeyAndOrderFront(self)
self.window?.level = .mainMenu + 100
NSApp.activate(ignoringOtherApps: true)
if customTextField.acceptsFirstResponder {
customTextField.window?.makeFirstResponder(customTextField)
}
// CustomMenuContoller.swift
let statusBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
@IBOutlet weak var CustomMenu: NSMenu!
@IBOutlet weak var customView: CustomView!
var customMenuItem: NSMenuItem!
override func awakeFromNib() {
customMenuItem = CustomMenu.item(withTitle: "TheMenu")
customMenuItem.view = customView
statusBarItem.menu = CustomMenu
}
受到El Tomato评论的启发,我找到了解决方案。
鉴于plusButtonClicked
仅限于其自己的上下文,即它所在的控制器和所有公共变量,我无法从中调用CustomMenu
方法。因为CustomMenu
本身不是公开的。但是它包含变量statusBarItem.menu
,是公共的,可以从所有其他视图访问。所以我在plusButtonClicked
动作中添加了statusBarItem.menu?.cancelTracking()
,它有效。