【问题标题】:How to gray out an NSMenuItem?如何使 NSMenuItem 变灰?
【发布时间】:2017-09-01 17:23:18
【问题描述】:

我正在使用 Swift 编写一个针对 macOS Sierra 的应用程序。

我有一个 NSMenuItem 想要灰显(因此用户甚至无法选择它)。

我已在 Storyboard 中将其父菜单 AutoEnableItems 设置为 FALSE,并通过登录我的代码验证它仍然为 false。

当我将 NSMenuItem 的 isEnabled 属性设置为 false 时,当我选择该菜单项时,不会调用与该菜单项关联的操作(这很好),但菜单仍然可选择。

我想要的是它是灰色的,显然用户无法选择。

【问题讨论】:

  • 你想让它变灰。从哪里?视图控制器?一个窗口控制器?应用代理?单身?
  • @ElTomato - 它来自我的 AppDelegate,在通知回调的上下文中(NotificationCenter 的观察者):我希望菜单根据触发通知的新值启用/禁用跨度>
  • 这不是我要找的答案。谁在发布通知以及如何发布?
  • @ElTomato 组件 A 调用 NotificationCenter.default.post() 以响应其属性之一(布尔值)的变化。这是在附加到该属性的 didSet() 函数中完成的。我的 AppDelegate 是该通知的观察者,它的回调被调用。在回调中,我检查布尔值并根据其值设置 MenuItem:如果为真,我希望菜单启用和黑色(因此可选择),如果为假,我希望菜单禁用和变灰(不可选择)

标签: swift macos menu nsmenu nsmenuitem


【解决方案1】:

根据文档,您正在做的事情听起来是正确的。

但是,我这样做的方式是在我的 AppDelegate 类中实现validateMenuItem。这个方法有点烦人,因为它被每个菜单项调用,菜单项作为参数传递。所以你得把参数打开,看看是不是你要禁用的菜单项,然后返回false。

这里有一个 Objective-C 示例:https://developer.apple.com/documentation/objectivec/nsobject/1518160-validatemenuitem

一个 Swift 示例可能如下所示:

override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {       
    switch menuItem.tag {
    case MenuItemTags.SignOut:
        return signOutEnabled()
    case MenuItemTags.CheckForUpdates:
        return updatesEnabled()
    default:
        return true
    }
}

您可能已经阅读过这篇文章,但这里有很多血淋淋的细节:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/MenuList/Articles/EnablingMenuItems.html

但是,正如我所说,这篇文章似乎表明您正在尝试的是正确的,所以谁知道呢?我可以肯定地说我的方法有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2011-03-04
    • 2012-03-19
    相关资源
    最近更新 更多