SwiftUI开发:点击计算按钮后添加结果条件化解释文本
SwiftUI 计算结果解释文本实现方案
核心修改点
- 存储原始Double结果:新增状态变量保存计算后的原始数值,方便后续判断逻辑
- 添加条件文本显示:根据原始结果值动态展示对应的解释文本
- 修复强制解包崩溃问题:用安全的可选绑定处理输入转换,避免程序崩溃
修改后的完整代码
import SwiftUI struct ContentView: View { enum FocusedField { case int } @FocusState private var focusedField: FocusedField? @State var HPEEP: String = "" @State var SetVT: String = "" @State var VTHPEEP: String = "" @State var LPEEP: String = "" @State var VTtotal: String = "" @State var Pplat: String = "" @State var answer: String = "" @State private var rawResult: Double? = nil // 新增:存储原始计算结果 @State private var showMenu: Bool = false var body: some View { NavigationView { ZStack { Color(.mint) .ignoresSafeArea(.all, edges: .all) ScrollView { VStack { HStack { Text("High PEEP") .font(.callout) .padding() Spacer() TextField("cmH2O", text: $HPEEP) .keyboardType(.numberPad) .ignoresSafeArea(.keyboard) .focused($focusedField, equals: .int) .textFieldStyle(.roundedBorder) .frame(width: 80) .padding() .cornerRadius(40) } HStack { Text("Set Tidal Volume") .font(.callout) .padding() Spacer() TextField("ml", text: $SetVT) .keyboardType(.numberPad) .focused($focusedField, equals: .int) .textFieldStyle(.roundedBorder) .frame(width: 80) .padding() .cornerRadius(40) } HStack { Text("Exhaled Tidal Volume at High PEEP") .font(.callout) .padding() Spacer() TextField("ml", text: $VTHPEEP) .keyboardType(.numberPad) .focused($focusedField, equals: .int) .textFieldStyle(.roundedBorder) .frame(width: 80) .padding() .cornerRadius(40) } HStack { Text("Low PEEP") .font(.callout) .padding() Spacer() TextField("cmH2O", text: $LPEEP) .keyboardType(.numberPad) .focused($focusedField, equals: .int) .textFieldStyle(.roundedBorder) .frame(width: 80) .padding() .cornerRadius(40) } HStack { Text("Exhaled Tidal Volume from High to Low PEEP") .font(.callout) .padding() Spacer() TextField("ml", text: $VTtotal) .keyboardType(.numberPad) .focused($focusedField, equals: .int) .textFieldStyle(.roundedBorder) .frame(width: 80) .padding() .cornerRadius(40) } HStack { Text("Plateau Pressure at Low PEEP") .font(.callout) .padding() Spacer() TextField("cmH2O", text: $Pplat) .keyboardType(.numberPad) .focused($focusedField, equals: .int) .textFieldStyle(.roundedBorder) .frame(width: 80) .padding() .cornerRadius(40) } Button { // 安全处理输入转换,避免强制解包崩溃 guard let setVT = Double(SetVT), let pplat = Double(Pplat), let lpeep = Double(LPEEP), let hpeep = Double(HPEEP), let vtTotal = Double(VTtotal), let vtHPEEP = Double(VTHPEEP), pplat != lpeep, // 防止除以0 hpeep != lpeep else { answer = "输入无效" rawResult = nil return } let Cbaby = setVT / (pplat - lpeep) let pVrec = hpeep - lpeep let ppVrec = pVrec * Cbaby let Vrec = vtTotal - vtHPEEP - ppVrec let Crec = Vrec / (hpeep - lpeep) let raw = max(Crec / Cbaby, 0) rawResult = raw // 保存原始Double结果 answer = String(format: "%.2f", raw) } label: { Text("Calculate") .fontWeight(.bold) .frame(width: 200.0, height: 50) .background(Color.blue) .cornerRadius(10) .foregroundColor(.white) .font(.system(size: 20)) .padding() } Text("RI = \(answer)") .font(.system(size: 20)) .fontWeight(.bold) // 新增:根据结果显示解释文本 if let result = rawResult { Text(result < 0.5 ? "XXX" : "YYY") .font(.system(size: 18)) .foregroundColor(result < 0.5 ? .red : .green) .padding(.top) } Spacer() } } .navigationTitle("Recruitability") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .keyboard) { Spacer() } ToolbarItem(placement: .keyboard) { Button { focusedField = nil } label: { Image(systemName: "keyboard.chevron.compact.down") } } } .toolbar { Button { self.showMenu.toggle() } label: { Image(systemName: showMenu ? "xmark" : "text.justify") .foregroundColor(Color.orange) } } } } } }
关键说明
- 原始结果存储:用
rawResult保存计算后的Double值,避免将字符串转回Double做判断,更高效也更可靠 - 条件文本:通过
if let判断结果是否存在,再用三元运算符选择显示的文本,还可以根据结果设置不同颜色增强视觉反馈 - 输入安全:用
guard let验证所有输入的有效性,包括避免除以0的情况,防止程序崩溃
内容的提问来源于stack exchange,提问作者Alfred Wong
相关产品推荐
相关产品推荐

