【问题标题】:Swift: How to change NSPopupButton edit menu item textSwift:如何更改 NSPopupButton 编辑菜单项文本
【发布时间】:2017-12-10 22:37:21
【问题描述】:

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

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

【问题讨论】:

    标签: edit menuitem nspopupbutton


    【解决方案1】:

    您的问题的直接答案是您可以通过NSPopUpButtonmenu 属性访问这些项目,然后在生成的菜单中使用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 添加到 passwordbits 属性允许 Cocoa 将魔法添加到访问器中,使其在属性更改时触发通知。

    • keyPathsForValuesAffectingPasswordStrength 属性告诉 Cocoa,当为passwordbits 触发通知时,它们也应该为passwordStrength 触发。

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

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

    对于我们的标签,我们会更花哨一些,并设置了一个涉及passwordStrengthbits 的模式:

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

    很漂亮,嗯?

    【讨论】:

    • @Beejo 对于真正整洁的东西,请查看我的答案的编辑版本:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    相关资源
    最近更新 更多