如何基于布尔值切换UIMenu Action的显示/隐藏标题?
可以通过两种方式实现需求,以下是具体步骤:
方案一:动态重建UIMenu(简单直接)
UIMenu和UIAction默认是不可变对象,因此可以在状态变化时,根据布尔值重新生成菜单:
- 定义全局状态变量(你已完成这一步):
var isContentHidden = true // 初始状态:内容隐藏,对应标题"show"
- 封装菜单创建方法,根据当前状态决定按钮标题:
func generateToggleMenu() -> UIMenu { let actionTitle = isContentHidden ? "show" : "hide" let toggleAction = UIAction(title: actionTitle, handler: menuHandler) return UIMenu(title: "menu", children: [toggleAction]) }
- 状态变化时更新菜单(比如给按钮绑定菜单时):
// 假设触发菜单的是一个UIButton yourTriggerButton.menu = generateToggleMenu() yourTriggerButton.showsMenuAsPrimaryAction = true
方案二:直接修改UIAction标题(高效,无需重建菜单)
iOS 14及以上支持直接修改UIAction的属性,无需重建整个菜单:
- 将UIAction定义为全局变量,方便后续修改:
var toggleAction: UIAction! var isContentHidden = true
- 在视图初始化时创建菜单:
override func viewDidLoad() { super.viewDidLoad() let initialTitle = isContentHidden ? "show" : "hide" toggleAction = UIAction(title: initialTitle, handler: menuHandler) let menu = UIMenu(title: "menu", children: [toggleAction]) // 绑定到按钮 yourTriggerButton.menu = menu yourTriggerButton.showsMenuAsPrimaryAction = true }
- 在菜单点击逻辑中同步更新状态和标题:
func menuHandler(action: UIAction) { // 切换状态 isContentHidden.toggle() // 更新按钮标题 toggleAction.title = isContentHidden ? "show" : "hide" // 同步处理内容的显示/隐藏 yourContentContainer.isHidden = isContentHidden }
注意事项
- 方案二要求部署目标为iOS 14及以上,若需兼容更低版本,建议使用方案一。
- 无论哪种方案,都要确保状态变量
isContentHidden与内容的实际显示状态保持同步。
内容的提问来源于stack exchange,提问作者Mie
相关产品推荐
相关产品推荐

