Swift使用3个UIStepper计算公交票总价 无法合并多票种价格如何解决
问题根源
你当前的代码存在两处核心逻辑错误,导致无法正确计算三类票的总价:
- 总价计算逻辑错误:没有按「单类票价 * 对应购票数量」的规则累加三类票的价格,而是错误地只要票种数量不为0就只加1次对应票价,再乘以当前触发操作的UIStepper值,完全不符合总价计算规则
- 按钮状态判断逻辑错误:仅判断当前触发的stepper值是否小于1来控制按钮状态,而非判断三类票总票数是否大于0,会出现总票数不为0但按钮被错误禁用的问题
修正后的完整代码
删除无用的全局totalPrice变量,修改两个更新方法即可:
@IBOutlet weak var seniorsTicketsStepper: UIStepper! @IBOutlet weak var adultsTicketsStepper: UIStepper! @IBOutlet weak var teenagersTicketsStepper: UIStepper! @IBOutlet weak var validateButton: UIButton! @IBOutlet weak var numOfTickets: UILabel! @IBOutlet weak var ticketsPrices: UILabel! @IBAction func seniorsTicketsTapped(_ sender: UIStepper) { updateTicketsCount() updateTicketsPrices() } @IBAction func adultsTicketsTapped(_ sender: UIStepper) { updateTicketsCount() updateTicketsPrices() } @IBAction func teenagersTicketsTapped(_ sender: UIStepper) { updateTicketsCount() updateTicketsPrices() } func updateTicketsCount() { // 统一设置三个stepper的最大值,也可以移动到viewDidLoad中仅设置一次 seniorsTicketsStepper.maximumValue = 10 adultsTicketsStepper.maximumValue = 10 teenagersTicketsStepper.maximumValue = 10 let totalCount = Int(seniorsTicketsStepper.value + adultsTicketsStepper.value + teenagersTicketsStepper.value) numOfTickets.text = "\(totalCount)" // 按总票数判断按钮状态 if totalCount < 1 { validateButton.isEnabled = false validateButton.backgroundColor = UIColor(red: 170/255, green: 170/255, blue: 170/255, alpha: 1) } else { validateButton.isEnabled = true validateButton.backgroundColor = UIColor(red: 0/255, green: 194/255, blue: 166/255, alpha: 1) } } func updateTicketsPrices() { // 分别计算三类票的总价再累加 let teenagerTotal = teenagersTicketsStepper.value * 0.75 let seniorTotal = seniorsTicketsStepper.value * 2.0 let adultTotal = adultsTicketsStepper.value * 3.0 let totalPrice = teenagerTotal + seniorTotal + adultTotal // 格式化价格保留两位小数,避免浮点精度导致的显示异常 ticketsPrices.text = String(format: "$%.2f", totalPrice) }
优化说明
- 删掉了不必要的参数传递和全局变量,每次计算直接读取三个UIStepper的当前值,保证计算准确性
- 价格计算改为单类票价乘以对应购票数量再累加,完全符合需求
- 增加价格格式化逻辑,避免出现类似
$3.7500000000001的异常展示 - 按钮状态判断改为基于总票数,逻辑更合理
- 将颜色创建的分母从250修正为标准的255,颜色显示更准确
内容的提问来源于stack exchange,提问作者fardi Clk
相关产品推荐
相关产品推荐

