TableView如何从表中过滤某些单元格

时间:2016-11-09 15:38:50

标签: ios swift swift3

在一个UITableViewController类负责使用单元格填充TableView,我想过滤一些单元格,但我无法弄清楚如何做到这一点。“ p>

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

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cellIdentifier = "MealTableViewCell"
       let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! MealTableViewCell

       let meal = meals[indexPath.row]
       cell.title.text = meal.name

       return cell
}

我有meal.veg : Bool属性,理想情况下,我想仅使用TableView的膳食填充meal.veg == true。我坚持的是,我无法理解override func tableView()如何填充表格。我的意思是如何调用此函数?我怎样才能过滤细胞。

因为函数的返回类型是UITableViewCell并且不是可选的,所以我必须返回一个单元格,它不允许进行单元格过滤。

3 个答案:

答案 0 :(得分:2)

问题 - 使用compile: function compile(element, attrs) { return { pre: function preLink(scope, iElement, iAttrs, controller) {}, post: function postLink(scope, iElement, iAttrs, controller) { if (!iAttrs.compiled) { iElement.attr('compiled', true); iElement.attr('ng-click', "$ctrl.onClick()"); $compile(iElement)(scope); } } }; } 时,首先触发的方法是UITableView,这将告诉TableView numberOfRowsInSection中有多少个单元格。获取数字时,方法TableView将被解雇,用于设计cellForRowAtIndexPath

现在你正在返回一个计数,让我们在TableView中说10,你只想显示5个单元格,让我们说这5个是numberOfRowsInSection,基于你的过滤器meal.veg,这是不可能的因为你需要从meal.veg == true返回一个单元格。

解决方案 - 要解决此问题,在重新加载表格视图之前,您需要过滤数组并过滤掉具有值cellForRowAtIndexPath的结果,然后您需要传递计数在meal.veg == true中过滤后的数组,根据过滤后的数组,您可以从numberOfRowsInSection设计您的单元格

答案 1 :(得分:1)

为什么不直接过滤餐食(在餐桌视图的数据源方法之外)而不是过滤细胞并相应地使用过滤餐的数量?像:

let filteredMeals = meals.filter { $0.veg == true }

答案 2 :(得分:1)

这是一个例子,还有一些额外的建议:)

好的,假设你有一堂课,比如:

class Meal {
    var name: String
    var veg: Bool

    init(_ name: String, isVeg veg: Bool) {
        self.name = name
        self.veg = veg
    }
}

然后你吃了一大堆饭菜:

let carrots = Meal("Carrots", isVeg: true)
let steak = Meal("Steak & chips", isVeg: false)
let curry = Meal("Chicken korma", isVeg: false)
let sausage = Meal("Bangers and mash!", isVeg: false)
let salad = Meal("Spring asparagus salad", isVeg: true)

let meals = [carrots, steak, curry, sausage, salad]

你想要做的是过滤那些饭菜(基于你喜欢的任何参数)。

var isFiltered = true
var filteredMeals = meals.filter { $0.veg }

在这里,您可以看到我为您是否要使用过滤器添加了值(isFiltered)。 (我们会在一秒钟内看到更多原因)。另请注意,filteredMeals位于单独的数组中,这样我们就不会丢失原始数据源,我们是否希望删除或更改过滤器。

使用tableView,然后设置numberOfRowsInSectioncellForRowAtIndexPath

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return isFiltered ? filteredMeals.count : meals.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cellIdentifier = "MealTableViewCell"
    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! MealTableViewCell

    let meal = isFiltered ? filteredMeals[indexPath.row] ? meals[indexPath.row]
    cell.title.text = meal.name

    return cell
}

所以在这里你可以看到我正在使用isFiltered变量来确定我是否要使用过滤后的结果。