UIButton绑定UIMenu首次需点击两次才弹出的问题求助
问题根源
你当前的代码是在按钮的点击事件oxygenButtonPressed里才创建并设置UIMenu和showsMenuAsPrimaryAction属性。首次点击按钮时,系统先执行这个点击事件里的代码完成菜单的初始化设置,但这次点击并不会触发菜单弹出;第二次点击时,菜单已经绑定到按钮上,所以能直接弹出。
修复方案
把菜单的创建和按钮的配置逻辑移到视图控制器的初始化阶段(比如viewDidLoad),而不是点击事件中。这样按钮在界面加载完成后就已经绑定好菜单,首次点击就能直接弹出。
优化后的代码示例
class YourViewController: UIViewController { @IBOutlet weak var oxygenButton: UIButton! let dateFormatter = DateFormatter() var codeLog = [CodeLog]() var date = Date() // 假设你已初始化该变量 override func viewDidLoad() { super.viewDidLoad() setupOxygenMenu() } private func setupOxygenMenu() { // 提取重复逻辑,减少代码冗余 let createAction: (String) -> UIAction = { lpm in UIAction(title: "\(lpm) LPM") { [weak self] _ in guard let self = self else { return } self.dateFormatter.dateFormat = "HH:mm:ss" let event = self.oxygenButton.titleLabel?.text ?? "Oxygen" let time = self.dateFormatter.string(from: self.date) self.codeLog.append(CodeLog(event: event, time: time, note: "\(lpm)LPM")) } } let actions = ["2", "4", "6", "8", "10", "15"].map(createAction) let oxygenMenu = UIMenu(title: "Oxygen Menu", options: .displayInline, children: actions) oxygenButton.showsMenuAsPrimaryAction = true oxygenButton.menu = oxygenMenu } // 移除原IBAction,菜单选择逻辑已在UIAction中处理 }
额外说明
- 移除了原按钮点击事件,因为菜单的选择逻辑已通过
UIAction完成,无需额外触发点击事件。 - 使用
[weak self]避免循环引用,提升代码安全性。 - 通过闭包
createAction提取重复逻辑,让代码结构更清晰。
内容的提问来源于stack exchange,提问作者Marshall N.
相关产品推荐
相关产品推荐

