ios - 多个 UIswitches 一个随机按钮

标签 ios swift uiswitch

我最近开始学习 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)
    }

最佳答案

建议:

  1. 创建两个数组,一个用于自定义类中 Bool 属性的名称/键

    let keys = ["orangeJuice", "lemonJuice" ... ]
    

    还有一个是对应开关的状态

    var states = [false, false, ...]
    
  2. 将标签分配给 UISwitches,按照键数组的顺序从零开始。

  3. 创建一个更改状态 IBAction 并将操作分配给所有 UISwitches

    @IBAction func changeState(sender: UISwitch) {
      let index = sender.tag
      states[index] = sender.on
    }
    
  4. 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/

相关文章:

ios - 导航栏样式

ios - 如何从 swift Xcode 中的不同类更改 UISwitch 的值?

iphone - 如果我将一个 UISwitch 控件添加到我的每个 TableView 单元格,我如何知道它属于哪个单元格?

ios - 核心数据 : How do you migrate an unversioned store?

iphone - 多采样渲染到 ios 中的纹理

ios - 如何根据key将JSON解析成不同的模型?

ios - Swift - URL 数组不起作用

ios - Swift:从表中删除 TableView 行而不将其从存储它的数据库中删除

ios - iOS 使用什么算法进行增量更新