在一个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
并且不是可选的,所以我必须返回一个单元格,它不允许进行单元格过滤。
答案 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
,然后设置numberOfRowsInSection
和cellForRowAtIndexPath
:
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
变量来确定我是否要使用过滤后的结果。