具有故事板的菜单栏 - validateMenuItem不会被调用

时间:2015-11-08 14:07:31

标签: swift macos delegates menubar

我尝试使用故事板设置菜单栏应用程序,但我的validateMenuItem方法未被调用。

我会尝试解释我的所作所为。 首先,我在应用场景中拖动了一个菜单项。然后我的MenuController有一个Object。创建了一个MenuController(MenuController.swift)并用代码填充它。回到我的故事板中,我将Menu委托设置为MenuController,将MenuController Outlet设置为Menu。 (我不完全确定我是否正确设置了代表。)

当我启动应用程序时,会出现菜单图标,并且第一个项目标题设置为test。但是,当我点击图标时,不会调用validateMenuItem方法。

MenuController.swift

import Cocoa
class MenuController: NSObject {

    var statusItem = NSStatusBar.systemStatusBar().statusItemWithLength(-1)

    @IBOutlet weak var statusMenu: NSMenu!
    @IBOutlet weak var item1: NSMenuItem!

    override func awakeFromNib() {
        print("awakeFromNib")

        self.item1.title = "Test"

        let icon = NSImage(named: "menubarIcon")
        statusItem.image = icon
        statusItem.menu = statusMenu
    }

    override func validateMenuItem(menuItem: NSMenuItem) -> Bool {
        print("validateMenuItem")
        return true
    }
}

故事板菜单代表 Storyboard Menu Delegates http://up.picr.de/23648472pu.jpg

Storyboard MenuController委托 Storyboard MenuController Delegates http://up.picr.de/23648473df.jpg

有人有想法吗?

来自奥地利的问候!

1 个答案:

答案 0 :(得分:4)

菜单/ UI验证机制不会查询菜单的委托,而是使用项目的目标来确定启用状态。
如果没有明确设置目标,它会遍历响应者链。

要获得基本验证,您必须确保设置以下内容:

  • 在Interface Builder中选中“自动启用项目”(默认情况下已启用)
  • 您可以控制 - 将菜单的操作拖到第一个响应者
  • 菜单的操作在作为响应者链一部分的类中实现(例如,管理UI的一组操作的视图控制器)

对于带有名为test的操作选择器的项目,validateUserInterfaceItem:的基本实现可能如下所示:

func validateUserInterfaceItem(anItem: NSValidatedUserInterfaceItem) -> Bool
{
    if anItem.action() == Selector("test:") {
        print("validating item \(anItem)")
        return true
    }
    return true
}