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

Swift中如何获取弹窗按钮选中项并应用于计算?

解决UIButton弹窗菜单选中项获取及计算问题

核心思路

UIButton的弹窗菜单(UIMenu)没有类似UISegmentedControl的selectedSegmentIndex属性,我们需要通过在菜单选项的点击回调中直接更新选中值,或者跟踪UIAction的选中状态来获取当前选择项,再用该值参与计算。

具体实现步骤

  • 绑定选项与计算值:给每个UIAction关联对应计算分值(比如格拉斯哥评分的对应分数),可通过映射表或UIAction的value属性实现。
  • 更新选中变量:在菜单选项的回调方法中,将选中项对应的分值赋值给全局变量,用于后续计算。
  • 使用选中值计算:在计算按钮的点击事件里,直接调用已更新的选中变量执行逻辑。

修改后的完整代码

//  GlasgoScaleCalculatorViewController.swift
//  MedicalCalc
//
//  Created by Andrei Dokuchaev on 30.12.2022.
//

import UIKit

class GlasgoScaleCalculatorViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setPopUpButton()
    }
    
    @IBOutlet weak var otkrivanieGlas: UIButton!
    @IBOutlet weak var resultKomaField: UILabel!
    
    // 存储选中的分值
    var otkrivanGlasSelected: Double = 0
    
    func setPopUpButton() {
        // 定义选项标题与对应分值的映射表
        let scoreMap: [String: Double] = [
            "Item1": 4.0,
            "Item2": 3.0,
            "Item3": 2.0,
            "Item4": 1.0
        ]
        
        let optionClosure = { [weak self] (action: UIAction) in
            guard let self = self else { return }
            // 根据选中项标题获取对应分值并更新变量
            if let score = scoreMap[action.title] {
                self.otkrivanGlasSelected = score
                // 可选:更新按钮标题,让用户直观看到当前选中项
                self.otkrivanieGlas.setTitle(action.title, for: .normal)
            }
        }
    
        otkrivanieGlas.menu = UIMenu(children: [
            UIAction(title: "Item1", state: .on, handler: optionClosure),
            UIAction(title: "Item2", handler: optionClosure),
            UIAction(title: "Item3", handler: optionClosure),
            UIAction(title: "Item4", handler: optionClosure)
        ])
        
        otkrivanieGlas.showsMenuAsPrimaryAction = true
        otkrivanieGlas.changesSelectionAsPrimaryAction = true
        // 初始化按钮标题为默认选中项
        otkrivanieGlas.setTitle("Item1", for: .normal)
        // 初始化选中值为默认项的分值
        otkrivanGlasSelected = scoreMap["Item1"] ?? 0
    }

    @IBAction func button(_ sender: Any) {
        // 根据选中分值执行计算逻辑
        switch otkrivanGlasSelected {
        case 4.0:
            resultKomaField.text = "睁眼反应正常"
        case 3.0:
            resultKomaField.text = "呼唤睁眼"
        case 2.0:
            resultKomaField.text = "刺痛睁眼"
        case 1.0:
            resultKomaField.text = "无反应"
        default:
            resultKomaField.text = "请选择评分项"
        }
        // 可扩展其他计算逻辑
    }
}

关键说明

  • 使用[weak self]避免循环引用,保证内存安全。
  • 映射表scoreMap让选项与分值的对应关系更清晰,后续维护更便捷;也可以直接给UIAction设置value属性(如UIAction(title: "Item1", value: 4.0, state: .on, handler: optionClosure)),通过action.value as? Double获取分值。
  • 更新按钮标题是可选操作,能提升用户交互体验,让用户直观看到当前选择。

内容的提问来源于stack exchange,提问作者avldokuchaev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:35:43