我的GUI上有一个NSPopupButton,我正在寻找一种以编程方式更改特定项目文本的方法:
'第1项'
'第2项'---> '项目b'
'第3项'
答案 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
添加到dynamic
和password
属性允许Cocoa将魔法粘贴到访问者身上,以便在属性发生变化时触发通知。
bits
属性告诉Cocoa,当keyPathsForValuesAffectingPasswordStrength
或password
的通知被触发时,它们也应该触发bits
。
现在,我们转到Interface Builder,将我们的安全密码字段绑定到passwordStrength
属性,如下所示:
然后,我们将滑块绑定到password
属性,如下所示:
对于我们的标签,我们得到了一点点发烧友并设置了一个涉及bits
和passwordStrength
的模式:
所以,除了一些属性定义之外几乎没有任何代码,我们得到这个:
漂亮,嗯?