在Swift中,如何通过单击嵌入式视图中的按钮来关闭/关闭/隐藏菜单?

时间:2019-04-03 23:37:13

标签: swift macos

我已经使用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
}


1 个答案:

答案 0 :(得分:0)

El Tomato的评论启发,我找到了解决方案。

鉴于plusButtonClicked限于其自己的上下文(该上下文是其所在的控制器以及所有公共变量)的事实,我无法从其中调用CustomMenu上的方法。因为CustomMenu本身不是公开的。但是它包含的变量statusBarItem.menu是公共的,可以从所有其他视图访问。因此,我在statusBarItem.menu?.cancelTracking()动作中添加了plusButtonClicked,它可以正常工作。