2016-11-09 15 views
-1

TableViewにセルを設定することに責任を持つUITableViewControllerクラスでは、いくつかのセルをフィルタリングする必要がありますが、どのように行うのかわかりません。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では、最初に解雇された方法は、これはどのように多くの細胞あなたのTableViewを設計するために使用されるメソッドcellForRowAtIndexPathがトリガーされます番号を取得した後、TableViewにあるテーブルビューを教えてくれますnumberOfRowsInSectionです。

今、あなたは、カウントを戻ってきているが、あなただけの5セルを表示したいのうちnumberOfRowsInSectionで10を使用して、セルを返却する必要があるとして、ことはできません、あなたのフィルターmeal.vegに基づいて、これらの5はmeal.veg == trueあると言うことができます言うことができますcellForRowAtIndexPathから。

ソリューション - あなたの配列をフィルタリングし、値meal.veg == trueを持っているそれらの結果をフィルタリングする必要があなたのテーブルビューをリロードする前に、それを解決するには、あなたはnumberOfRowsInSectionにし、としてあなたフィルター配列の数を渡す必要がありますそのフィルタリングされた配列ごとにセルを設計できますcellForRowAtIndexPath

1

セルの代わりに(テーブルビューのデータソースメソッドの外で)食事をフィルタリングし、それに応じてフィルタリングされた食事の数を使用するのはなぜですか?同様に:

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

ここではいくつかの余分な提案を、一例です:)

OKそうのようなもの、あなたがクラスを持っているとしましょう:次に、あなたがの負荷を持っている

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変数を利用するか、いないよ見ることができます。

関連する問題