You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改NSPopUpButton显示标题?让折叠按钮显示货币缩写而非全名

实现NSPopUpButton折叠显示缩写、展开显示全称的轻量化方案

刚好有过类似的需求,不用费劲子类化NSPopUpButtonCell重绘,有个超轻量化的方案,核心就是让按钮的标题和选中菜单项的标题解绑,手动控制折叠时显示的内容,具体步骤如下:

1. 给菜单项附加缩写信息

创建菜单时,把货币全称设为NSMenuItem的标题,同时将对应的缩写存到菜单项的representedObject属性里——这个属性就是用来给菜单项绑定自定义数据的,非常适合这种场景:

// 示例货币数据,你可以换成自己的数据源
let currencyList = [
    (fullName: "US Dollar", code: "USD"),
    (fullName: "Euro", code: "EUR"),
    (fullName: "Japanese Yen", code: "JPY"),
    (fullName: "British Pound", code: "GBP")
]

// 给你的NSPopUpButton添加菜单项
for currency in currencyList {
    let menuItem = NSMenuItem(title: currency.fullName, action: nil, keyEquivalent: "")
    menuItem.representedObject = currency.code // 存缩写
    yourCurrencyPopUp.menu?.addItem(menuItem)
}

2. 设置初始按钮标题

在界面初始化完成后,把按钮的title手动设置为默认选中项的缩写,替代默认的菜单项全称:

if let defaultItem = yourCurrencyPopUp.selectedItem,
   let defaultCode = defaultItem.representedObject as? String {
    yourCurrencyPopUp.title = defaultCode
}

3. 监听选中变化,更新按钮标题

默认情况下NSPopUpButton会自动把选中菜单项的标题同步到按钮上,所以我们需要监听选中事件,手动覆盖按钮标题为对应缩写:

// 先给按钮绑定动作和目标
yourCurrencyPopUp.target = self
yourCurrencyPopUp.action = #selector(onCurrencySelected(_:))

// 实现选中后的处理方法
@objc func onCurrencySelected(_ sender: NSPopUpButton) {
    guard let selectedItem = sender.selectedItem,
          let currencyCode = selectedItem.representedObject as? String else {
        // 兜底:如果拿不到缩写,就显示全称
        sender.title = sender.selectedItem?.title ?? ""
        return
    }
    sender.title = currencyCode
}

这样设置后,折叠状态下按钮会显示货币缩写,展开菜单时看到的是完整的货币名称,完全不需要自定义绘制,代码量少还易于维护。

内容的提问来源于stack exchange,提问作者Thomas Krajacic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:49:13