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

UIButton绑定UIMenu首次需点击两次才弹出的问题求助

问题解决: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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:05:34