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