Swift:如何更改NSPopupButton编辑菜单项文本

时间:2017-12-10 22:37:21

标签: edit menuitem nspopupbutton

我的GUI上有一个NSPopupButton,我正在寻找一种以编程方式更改特定项目文本的方法:

'第1项' '第2项'---> '项目b'
'第3项'

1 个答案:

答案 0 :(得分:1)

您问题的直接答案是,您可以通过NSPopUpButton的{​​{1}}媒体资源访问这些项目,然后在结果菜单中访问menu媒体资源。但是不要在这里停止阅读,因为那不是我做的方式。

最有可能的是,您想要更改菜单项的原因是为了反映模型中某些内容的状态。也许标题是上下文敏感的,并且应该根据当前选择或类似的东西而改变。您通常可以在不需要items的插座的情况下执行此操作,只需在菜单项目标NSPopUpButton方法中执行此操作:

validateMenuItem

这不仅简化了您的设计,降低了程序逻辑需要了解UI设置的级别,而且还更灵活,因为它适用于任何菜单项指向相同的目标和行动。如果您决定将菜单项移出弹出按钮并进入标准菜单栏,基于工具栏的菜单或其他内容,或者如果您希望在其中几个位置拥有多个菜单项, ; ll所有工作完全相同,无需编写任何新代码。

我有时使用的另一个技巧是通过Cocoa Bindings填充菜单项的标题。这也具有将UI与界面分离的效果,但是对于您可能不想进入的主题而言,它是更高级的。

编辑:既然我知道你的用例,那就是我倾向于使用Cocoa Bindings的东西:-)类似的东西:

override func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
    if menuItem.action == #selector(someAction:) {
        if self.someCondition {
            menuItem.title = "Foo"
        } else {
            menuItem.title = "Bar"
        }
    }

    return super.validateMenuItem(menuItem)
}

基本上,这里发生的是:

  • 一切都是class MyViewController: NSViewController { ... // make these @objc and dynamic so that they are KVC-compliant @objc dynamic var password: String @objc dynamic var bits: Int // register our password strength as dependent on 'password' and 'bits' @objc private static let keyPathsForValuesAffectingPasswordStrength: Set<String> = [ #keyPath(password), #keyPath(bits) ] @objc var passwordStrength: String { // obviously you'll do a better test than this in real life ;-) if self.password.count >= 8 { return NSLocalizedString("Strong", comment: "Strong") } else { return NSLocalizedString("Weak", comment: "Weak") } } ... } ,因为Cocoa Bindings是用Objective-C编写的,需要能够看到我们的属性。

  • @objc添加到dynamicpassword属性允许Cocoa将魔法粘贴到访问者身上,以便在属性发生变化时触发通知。

  • bits属性告诉Cocoa,当keyPathsForValuesAffectingPasswordStrengthpassword的通知被触发时,它们也应该触发bits

    < / LI>

现在,我们转到Interface Builder,将我们的安全密码字段绑定到passwordStrength属性,如下所示:

enter image description here

然后,我们将滑块绑定到password属性,如下所示:

enter image description here

对于我们的标签,我们得到了一点点发烧友并设置了一个涉及bitspasswordStrength的模式:

enter image description here

所以,除了一些属性定义之外几乎没有任何代码,我们得到这个:

enter image description here

漂亮,嗯?