如何以编程方式触发UIMenu项并打开Copy子菜单?
一、推荐方案:直接复用菜单逻辑(稳定无依赖)
如果是你自己开发的App,优先采用这种方式,避免依赖视图层级的不稳定实现:
1. 提前保留菜单引用
在创建UIMenu时,把包含子菜单的"Copy"动作保存为实例变量,方便后续调用:
// 创建Copy的子菜单 let copySubmenu = UIMenu(title: "", children: [ UIAction(title: "复制到剪贴板") { _ in // 子菜单动作逻辑 }, UIAction(title: "复制为链接") { _ in // 子菜单动作逻辑 } ]) // 创建Copy主动作并绑定子菜单 let copyAction = UIAction(title: "Copy", submenu: copySubmenu) { _ in // 主项点击的逻辑(如果需要) } // 保存为实例变量 private var copyMenuAction: UIAction! // 将菜单绑定到目标控件(比如UIButton) yourTargetButton.menu = UIMenu(title: "", children: [copyAction]) yourTargetButton.showsMenuAsPrimaryAction = true
2. 编程触发子菜单展示
需要打开Copy的子菜单时,直接调用系统API展示子菜单:
// 获取要展示菜单的目标视图 let targetView = yourTargetButton // 定义菜单展示的位置(这里以视图 bounds 为例,可按需调整) let displayRect = targetView.bounds // 直接展示子菜单 copyMenuAction.submenu?.show(from: targetView, rect: displayRect)
如果需要同时触发Copy主项的动作逻辑,先调用copyMenuAction.send()再展示子菜单即可。
二、模拟用户点击(仅适用于测试或特殊场景)
这种方式依赖系统私有视图结构,iOS版本更新后可能失效,且正式App使用可能影响审核,仅作参考:
递归查找菜单按钮并模拟点击
import UIKit extension UIView { // 递归查找标题匹配的菜单按钮 func findMenuButton(withTitle title: String) -> UIView? { if let button = self as? UIButton, button.titleLabel?.text == title { return button } for subview in subviews { if let foundButton = subview.findMenuButton(withTitle: title) { return foundButton } } return nil } } // 使用示例 if let copyButton = yourTargetView.findMenuButton(withTitle: "Copy") { // 模拟用户点击事件 copyButton.sendActions(for: .touchUpInside) }
内容的提问来源于stack exchange,提问作者Hassan Taleb
相关产品推荐
相关产品推荐

