2015-11-08 59 views
1

我试图安装使用故事板在菜单栏的应用程序,但我validateMenuItem方法不会被调用。菜单栏与故事板 - validateMenuItem不会被调用

我会尽量解释我做了什么。 首先我在我的应用场景中拖动菜单项。然后一个对象为我的MenuController。创建一个MenuController(MenuController.swift)并用代码填充它。回到故事板中,我将Menu委托设置为MenuController,将MenuController Outlet设置为Menu。 (我不能完全肯定我是否已正确设置代表。)

当我启动应用程序,菜单图标出现,第一项标题设置为测试。但是当我点击图标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

故事板MenuController代表 Storyboard MenuController Delegates http://up.picr.de/23648473df.jpg

有任何人的想法?来自奥地利

映入眼帘!

回答

3

菜单/ UI验证机制不查询菜单的委托,但使用该项目的目标,确定启用状态来代替。
如果目标没有明确设置,它走的响应链。

为了获得基本的验证,你必须确保下面的事情是设置:

  • “自动启用项目”(默认情况下)在Interface Builder检查
  • 您控制拖菜单的行动的第一个响应者
  • 菜单的动作是在类,它是响应链的一部分来实现(例如管理一组动作对你的UI视图控制器)

基本实现的validateUserInterfaceItem:可能看起来像用行动选择的项目以下称为测试:

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

我忘记连接动作。现在它可以工作。谢谢!! – FaHa