我最近开始学习 Swift,这是我第一次尝试学习如何编程,并且我开始了我的第一个应用程序。我使用了几个教程,到目前为止我可以通过研究解决所有问题。现在我卡住了。
我想创建一个可以根据过滤器从数组(鸡尾酒)中为我挑选随机鸡尾酒的应用程序。为此,我创建了 21 个过滤器(例如,cocktail.filter({!$o.orangeJuice})
。这会使用橙汁将所有鸡尾酒从数组中取出。)。
创建 UI 我添加了 21 个 UISwitch 来切换是否必须应用过滤器。
我的随机按钮有效,并且显示了一个随机的鸡尾酒名称,但我无法让这些 UISwitch 起作用。
查看我的代码:
var cocktailNoOrangeJuice = cocktails.filter({!$0.orangeJuice})
var cocktailNoLemonJuice = cocktails.filter({!$0.lemonJuice})
var cocktailNoAppleJuice = cocktails.filter({!$0.appleJuice})
var cocktailNoMaraJuice = cocktails.filter({!$0.maraJuice})
var cocktailNoLimeJuice = cocktails.filter({!$0.limeJuice})
var cocktailNoBananaJuice = cocktails.filter({!$0.bananaJuice})
var cocktailNoPeachJuice = cocktails.filter({!$0.peachJuice})
var cocktailNoCherryJuice = cocktails.filter({!$0.cherryJuice})
var cocktailNoJohanJuice = cocktails.filter({!$0.johanJuice})
var cocktailNoMangoJuice = cocktails.filter({!$0.mangoJuice})
var cocktailNoGrapefJuice = cocktails.filter({!$0.grapefJuice})
var cocktailNoTomatoJuice = cocktails.filter({!$0.tomatoJuice})
var cocktailNoCranbJuice = cocktails.filter({!$0.cranbJuice})
var cocktailNoBloodJuice = cocktails.filter({!$0.bloodJuice})
var cocktailNoPineapJuice = cocktails.filter({!$0.pineapJuice})
var cocktailNoCola = cocktails.filter({!$0.cola})
var cocktailNoSprite = cocktails.filter({!$0.sprite})
var cocktailNoBitter = cocktails.filter({!$0.bitter})
var cocktailNoTonic = cocktails.filter({!$0.tonic})
var cocktailNoGinger = cocktails.filter({!$0.ginger})
var cocktailNoAlc = cocktails.filter({!$0.noalc})
//this is a new array currently with the "noalc"-filter applied
var cocktailfiltered = cocktails.filter({!$0.noalc})
class ViewController: UIViewController {
// this is one of the UISwitches
@IBOutlet weak var lemon: UISwitch!
// The label for Cocktail output and the random button
@IBOutlet weak var ergebnis: UILabel!
@IBAction func random(sender: AnyObject) {
let randomIndex = Int(arc4random_uniform(UInt32(cocktailfiltered.count)))
ergebnis.text = (cocktailfiltered[randomIndex].name)
}
}
如果这太傻了,请原谅我。我找到了如何获取 UISwitch
的状态(例如 lemon.on ...),但无法使用此信息来应用过滤器。
非常感谢任何帮助。虽然我最初希望能够自己解决这个问题,但现在它变得令人沮丧。 请注意,鸡尾酒被定义为一个类的成员,并且橙汁等每种成分都会抛出一个 bool 值。因此过滤器是手动工作的。但不在 UI 中。
编辑:所以这是现在的版本。在我看来,由于@vadian,它看起来好多了,但会导致我的应用程序崩溃。
类 View Controller :UIViewController {
let keys = ["lemonJuice", "limeJuice", "bananaJuice", "pineapJuice", "maraJuice", "mangoJuice", "orangeJuice", "appleJuice", "peachJuice", "bloodJuice", "grapefJuice", "tomatoJuice", "cranbJuice", "cherryJuice", "johanJuice", "cola", "sprite", "bitter", "tonic", "ginger", "noalc"]
var states = [true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true]
@IBAction func changeState(sender: UISwitch) {
let index = sender.tag
states[index] = sender.on}
@IBOutlet weak var ergebnis: UILabel!
@IBAction func random(sender: AnyObject) {
var conditions = [String]()
for (index, state) in states.enumerate() {
if state {
conditions.append("(\(keys[index]) == TRUE)")
}
}
let format = conditions.joinWithSeparator(" AND ")
let predicate = NSPredicate(format:format)
let filtered = (cocktails as NSArray).filteredArrayUsingPredicate(predicate)
let randomIndex = Int(arc4random_uniform(UInt32(filtered.count)))
ergebnis.text = (filtered[randomIndex].name)
}
最佳答案
建议:
创建两个数组,一个用于自定义类中
Bool
属性的名称/键let keys = ["orangeJuice", "lemonJuice" ... ]
还有一个是对应开关的状态
var states = [false, false, ...]
将标签分配给
UISwitch
es,按照键数组的顺序从零开始。创建一个更改状态
IBAction
并将操作分配给所有UISwitch
es@IBAction func changeState(sender: UISwitch) { let index = sender.tag states[index] = sender.on }
在
random
函数中通过重复循环以编程方式创建一个NSPredicate
以获取states 的所有
数组和true
值keys
数组对应的key。然后通过该谓词过滤鸡尾酒数组并获得随机鸡尾酒。
PS:为了获得良好的用户体验,请在 changeState
函数中获取过滤后的鸡尾酒,并在没有鸡尾酒与所选成分匹配的情况下通知用户。
更新:
创建谓词的例子
var conditions = [String]()
for (index, state) in states.enumerate() {
if state {
conditions.append("(\(keys[index]) == TRUE)")
}
}
let format = conditions.joinWithSeparator(" AND ")
let predicate = NSPredicate(format:format)
关于ios - 多个 UIswitches 一个随机按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34547944/