如何修改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
相关产品推荐
相关产品推荐

