在这个应用程序中,我正在研究我有9个UiSwitch,我正在使用它来增加披萨的费用,以便选择
mushroom - 0.10
cheese - 0.20
pepperoni 0.50
sausage - 0.45
jalapeno - 0.40
pineapple - .30
olive - 0.60
ham - .75
bacon 1.00
数百种可能的组合我的问题是如何在不必拥有一大堆if语句的情况下计算费用,因为目前我正在做的事情
答案 0 :(得分:1)
只需为模型中的每个UISwitch
关联一个值,然后循环浏览所有开关,找出哪些是on
。如果开关为on
,则将其关联值添加到总数中。
或者,你可以为每个开关实现一个委托(尽管应该是同一个对象),当一个开关被轻敲时触发计算。
备选方案#2(但这很难看):为每个UISwitch分配一个'标签',并带有相应的顶部值(但标签是整数),并对分配有on
个开关的标签求和。再次,编码非常糟糕。
答案 1 :(得分:1)
只需创建NSMutableArray
,只要切换UISwitch
,就可以向NSMutableArray
添加/删除相应的值。当单击“submit
”按钮或其他任何内容时,只需迭代数组并使用简单的for statement
答案 2 :(得分:-2)
所以,这是实现你想要的方法。您将顶部的价格与tag
的{{1}}属性相关联。然后,您可以简单地迭代您已获得的UISwitch
个对象的数组,快速总结所选顶部的成本,不需要UISwitch
个语句:
if
注意: 显然,您可能希望更新此UI布局。我猜你最终想把它放在
// ViewController.swift import UIKit class ViewController: UIViewController { override func viewDidLoad () { super.viewDidLoad() setupUserInterface() } var switches: [UISwitch] = [UISwitch]() var toppingNames = ["Mushrooms", "Cheese", "Pepperoni", "Sausage", "Jalapeño", "Pineapple", "Olive", "Ham", "Bacon"] var toppingCosts = [10, 20, 50, 45, 40, 30, 60, 75, 100] var costLabel: UILabel = UILabel() func switchFlipped () { var cost: CGFloat = costForSelectedToppings() var formatter: NSNumberFormatter = NSNumberFormatter() formatter.numberStyle = .CurrencyStyle var costString: String = formatter.stringFromNumber((cost))! self.costLabel.text = "Cost for toppings: " + costString } func costForSelectedToppings () -> CGFloat { var cost: CGFloat = 0.0 for swtch: UISwitch in self.switches { if (swtch.on == true) { cost = cost + (CGFloat)(swtch.tag) } } return cost / 100.0 } func setupUserInterface () { var previousLabel: UILabel? for i in 0...8 { var label: UILabel = UILabel() var swtch: UISwitch = UISwitch() self.switches.append(swtch) label.text = self.toppingNames[i] swtch.tag = self.toppingCosts[i] label.setTranslatesAutoresizingMaskIntoConstraints(false) swtch.setTranslatesAutoresizingMaskIntoConstraints(false) swtch.addTarget(self, action: "switchFlipped", forControlEvents: .ValueChanged) self.view.addSubview(label) self.view.addSubview(swtch) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat( "H:|-[label]-[switch]-|", options:NSLayoutFormatOptions(0), metrics:nil, views:["label" : label, "switch" : swtch])) self.view.addConstraint(NSLayoutConstraint( item: swtch, attribute:.CenterY, relatedBy:.Equal, toItem:label, attribute:.CenterY, multiplier:1.0, constant:0.0)) if let prev = previousLabel { self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label1]-(spacing)-[label2]", options:NSLayoutFormatOptions(0), metrics:["spacing" : 16], views:["label1" : previousLabel!, "label2": label])) } else { self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-(margin)-[label]", options:NSLayoutFormatOptions(0), metrics:["margin" : 40], views:["label" : label])) } previousLabel = label } self.costLabel.setTranslatesAutoresizingMaskIntoConstraints(false) self.costLabel.text = "Cost for toppings: $0.00" self.view.addSubview(self.costLabel) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[label]-|", options:NSLayoutFormatOptions(0), metrics:nil, views:["label" : self.costLabel])) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label1]-(spacing)-[label2]", options:NSLayoutFormatOptions(0), metrics:["spacing" : 16], views:["label1" : previousLabel!, "label2": self.costLabel])) } }
或者至少放在UITableView
中以防内容在屏幕外运行。