2016-11-09 74 views
-1

UITableViewController類別中負責填充單元格的TableView,我想過濾一些單元格,但我無法弄清楚如何做到這一點。TableView如何過濾表格中的某些單元格

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和理想,我想只與meal.veg == true飯菜來填充TableView。我堅持的是,我無法真正瞭解override func tableView()如何填充表格。我的意思是如何調用這個函數?我怎樣才能過濾細胞。

因爲函數的返回類型是UITableViewCell而且不是可選的,所以我必須返回一個單元格,這不允許單元格過濾的機會。

+1

您需要對陣列數據源執行過濾器:「飯食」。就像'meals.filter({$ 0.veg == true})'' – Larme

回答

2

問題 - 隨着UITableView,它首先被燒成方法是numberOfRowsInSection這將告訴TableView中,有多少細胞是存在於TableView獲取方法cellForRowAtIndexPath將被解僱的人數將用來設計你的TableView後。

現在你返回統計數可以說10 numberOfRowsInSection外面你只是想顯示5號電池可以說那些5 meal.veg == true,根據您的過濾器meal.veg因爲你需要返回一個細胞,這是不可能從cellForRowAtIndexPath

解決方案 - 要解決這個問題,重裝你需要過濾陣列,並且過濾掉這些具有值meal.veg == true這些結果的表格視圖之前,你需要通過你的過濾陣列的計數numberOfRowsInSection和你可以設計你的細胞從cellForRowAtIndexPath

1

爲什麼你不只是過濾膳食(表視圖的數據源方法之外)而不是細胞,並相應地使用過濾的膳食計數?像:

let filteredMeals = meals.filter { $0.veg == true } 
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變量來確定我是否要使用過濾的結果或者不。

相關問題