Swift中如何获取弹窗按钮选中项并应用于计算?
核心思路
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
相关产品推荐
相关产品推荐

