【发布时间】:2017-12-10 22:37:21
【问题描述】:
我的 GUI 上有一个 NSPopupButton,我正在寻找一种以编程方式更改特定项目文本的方法:
“项目 1”
'项目 2' ---> '项目 b'
“第 3 项”
【问题讨论】:
标签: edit menuitem nspopupbutton
我的 GUI 上有一个 NSPopupButton,我正在寻找一种以编程方式更改特定项目文本的方法:
“项目 1”
'项目 2' ---> '项目 b'
“第 3 项”
【问题讨论】:
标签: edit menuitem nspopupbutton
您的问题的直接答案是您可以通过NSPopUpButton 的menu 属性访问这些项目,然后在生成的菜单中使用items 属性。但是不要停止阅读这里,因为我不会这样做。
您想要更改菜单项的原因很可能是为了反映模型中某些内容的状态。也许标题是上下文相关的,应该根据当前的选择或类似的东西而改变。您通常可以完全不需要NSPopUpButton 的出口,只需在菜单项目标的validateMenuItem 方法中执行此操作即可:
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)
}
这不仅简化了您的设计并减少了您的程序逻辑需要了解您的 UI 设置的级别,而且还更加灵活,因为它适用于指向同一目标的任何菜单项和行动。如果您决定将菜单项从弹出按钮移到标准菜单栏、基于工具栏的菜单或其他位置,或者如果您希望在其中几个位置有多个菜单项,它们将无需编写任何新代码,所有工作方式完全相同。
我有时使用的另一个技巧是通过 Cocoa Bindings 填充菜单项的标题。这也具有将 UI 与界面分离的效果,但比您可能还不想跳入的主题更高级。
编辑:现在我知道您的用例,这正是我倾向于使用 Cocoa Bindings 的那种事情:-) 类似:
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")
}
}
...
}
基本上,这里发生的事情是:
一切都是@objc,因为Cocoa Bindings 是用Objective-C 编写的,需要能够看到我们的属性。
将 dynamic 添加到 password 和 bits 属性允许 Cocoa 将魔法添加到访问器中,使其在属性更改时触发通知。
keyPathsForValuesAffectingPasswordStrength 属性告诉 Cocoa,当为password 或bits 触发通知时,它们也应该为passwordStrength 触发。
现在,我们只需转到 Interface Builder,并将我们的安全密码字段绑定到 password 属性,如下所示:
然后,我们将滑块绑定到bits 属性,如下所示:
对于我们的标签,我们会更花哨一些,并设置了一个涉及passwordStrength 和bits 的模式:
因此,除了一些属性定义之外几乎没有任何代码,我们得到了:
很漂亮,嗯?
【讨论】: