我已经使用Mac OS的Swift创建了一个菜单应用程序,其中,自定义视图是唯一的菜单项。此自定义视图上有一个加号按钮,它将打开一个具有文本字段的窗口。
当我单击加号按钮时,将出现窗口,但菜单不会消失。文本字段也不是重点。当我键入一个字母时,该字母未显示在文本字段中,但菜单消失了,并且文本字段已聚焦并准备接收输入。
我想使自定义视图或菜单消失,并且让文本字段准备好在我单击加号按钮时(而不是在按下额外的键之后)接收击键。
我该如何实现?我在做什么错了?
这是我的代码:
// 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
}
答案 0 :(得分:0)
受El Tomato的评论启发,我找到了解决方案。
鉴于plusButtonClicked
限于其自己的上下文(该上下文是其所在的控制器以及所有公共变量)的事实,我无法从其中调用CustomMenu
上的方法。因为CustomMenu
本身不是公开的。但是它包含的变量statusBarItem.menu
是公共的,可以从所有其他视图访问。因此,我在statusBarItem.menu?.cancelTracking()
动作中添加了plusButtonClicked
,它可以正常工作。