如何仅显示表中的筛选数据

时间:2015-07-18 08:50:12

标签: swift

如何显示decks.status == true的数据,并忽略那些设置为false的对象?

数据:

var decks: [DeckOfCards]

我现在得到了什么:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TableViewCell

    if (thedeck.decks[indexPath.row].status == true) {
        cell.label.text = "\(thedeck.decks[indexPath.row].card.name)"
    }
}

3 个答案:

答案 0 :(得分:1)

你可以在甲板上使用过滤功能

let filteredDecks = decks.filter({$0.status})

答案 1 :(得分:1)

将数组过滤为

   self.decks = self.decks.filter {
          (d: DeckOfCards) -> Bool in
          return d.status == true
    }

现在您的数组将具有过滤值。你不需要检查status函数内的cellForRowAtIndexPath

答案 2 :(得分:1)

你以错误的方式解决这个问题。到达cellForRowAtIndexPath时,您已经声明应该为此索引路径出一个单元格(因此在数据数组中的此索引处)。正在进行此过滤的正确位置在您的数据源中。

例如,除了decks数组之外,您还可以创建一个计算属性(filteredDecks),通过过滤decks数组来获取其值。

var decks = [DeckOfCards]
var filteredDecks: [DeckOfCards] {
    return decks.filter { $0.status }
}

然后,您可以将此属性用作表视图的数据源。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return filteredDecks.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
    cell.label.text = "\(filteredDecks[indexPath.row].card.name)"

    return cell
}

现在,由于此解决方案计算每个属性访问的filteredDecks数组,如果decks是一个大数组,或者您经常重新加载表视图,它可能不是最好的方法。如果是这种情况,并且可以这样做,您应该使用上面计算属性中显示的相同方法提前过滤decks数组。