Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 带有情节提要的菜单栏-未调用ValidateNuItem_Swift_Macos_Delegates_Menubar - Fatal编程技术网

Swift 带有情节提要的菜单栏-未调用ValidateNuItem

Swift 带有情节提要的菜单栏-未调用ValidateNuItem,swift,macos,delegates,menubar,Swift,Macos,Delegates,Menubar,我正在尝试使用storyboard设置菜单栏应用程序,但未调用我的ValidateNuItem方法 我会尽力解释我做了什么。 首先,我在应用程序场景中拖动了一个菜单项。然后是我的菜单控制器的一个对象。创建了一个MenuController(MenuController.swift)并用代码填充它。在我的故事板中,我将菜单委托设置为MenuController,将MenuController出口设置为Menu。(我不完全确定是否正确设置了代理。) 当我启动应用程序时,菜单图标出现,第一个项目标题设

我正在尝试使用storyboard设置菜单栏应用程序,但未调用我的
ValidateNuItem
方法

我会尽力解释我做了什么。 首先,我在应用程序场景中拖动了一个菜单项。然后是我的菜单控制器的一个对象。创建了一个MenuController(MenuController.swift)并用代码填充它。在我的故事板中,我将菜单委托设置为MenuController,将MenuController出口设置为Menu。(我不完全确定是否正确设置了代理。)

当我启动应用程序时,菜单图标出现,第一个项目标题设置为测试。但是当我单击图标时,
validateNuitem
方法不会被调用

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
    }
}
情节提要菜单代理
(来源:)

情节提要菜单控制器委托
(来源:)

有人有主意吗


来自奥地利的问候

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

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

  • 在Interface Builder中选中“自动启用项目”(默认情况下启用)
  • 控件将菜单的操作拖动到第一个响应程序
  • 菜单的操作在作为响应程序链一部分的类中实现(例如,管理UI的一组操作的视图控制器)
validateUserInterfaceItem:
的基本实现对于具有称为test的操作选择器的项可能如下所示:

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

我忘了连接一个动作。现在它起作用了。非常感谢。注意:实现操作和
validateUserInterfaceItem(:)
的类还需要在协议/继承列表中包括
NSUserInterfaceValidations
。如果没有,验证方法将不会被调用。这是objc魔术,在swift中没有内省,所以你必须告诉运行时,它一直在咬我,我使用NSMenuDelegate、NSMenuItemValidation来处理我的右键单击上下文菜单mmh,不适用于AppDelegateOh中定义的操作方法。忘记将
validateUserInterfaceItem
标记为
@objc
。现在它工作了!