Swift如何仅在我的数据库中有值时才显示表格视图单元格
Posted
技术标签:
【中文标题】Swift如何仅在我的数据库中有值时才显示表格视图单元格【英文标题】:Swift How do I show tableview cell only if there is value in my database 【发布时间】:2016-10-26 05:36:40 【问题描述】:这是我的数据库结构
"type" :
"A" :
"nightAmount" : 5,
"noonAmount" : 2
,
"B" :
"nightAmount" : 5,
"noonAmount" : 3
,
"C" :
"nightAmount" : 2,
"noonAmount" : 5
我希望我的 tableviewCell 显示如下标签:-
第一个单元格:A - noonAmount - 2
第二个单元格:A - nightAmount - 5
第三个单元格:B - noonAmount - 3
第 4 格:B - nightAmount - 5
第 5 个单元格:C - noonAmount - 5
第 6 个单元格:C - nightAmount - 2
但是金额可以为0,我不希望金额为0的类型显示在我的tableview单元格上,
我想在cellforrowat
函数中调用什么?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "confCell")! as UITableViewCell
这是我的numberofrowsinsection
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if AnoontAmount >= 1
let V1 = 1
else V1 = 0
if ANightAmount >= 1
let V2 = 1
else V2 = 0
if BnoonAmount >= 1
let V3 = 1
else V3 = 0
if BNightAmount >= 1
let V4 = 1
else V4 = 0
if CnoonAmount >= 1
let V5 = 1
else V5 = 0
if CNightAmount >= 1
let V6 = 1
else V6 = 0
let cellTotal = V1 + V2 + V3 + V4 + V5 + V6
return cellTotal
不知道有没有效果
谁能告诉我是否有合适的方法来完成这项工作?
谢谢!!
更新
我更新了我的代码如下
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
var cellTotal = 0
if V1amount > 0
cellTotal += 1
if V2amount > 0
cellTotal += 1
if V3amount > 0
cellTotal += 1
if V4amount > 0
cellTotal += 1
if V5amount > 0
cellTotal += 1
if V6amount > 0
cellTotal += 1
return cellTotal
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
var mealtype : Array = ["TypeA", "TypeA", "TypeB", "TypeB", "TypeC", "TypeC"]
var mealtime : Array = ["lunch", "dinner", "lunch","dinner","lunch","dinner"]
var mealamount : Array = ["\(V1amount!)","\(V2amount!)","\(V3amount!)","\(V4amount!)","\(V5amount!)","\(V6amount!)"]
if V1amount == 0
mealtype.remove(at: 0)
mealtime.remove(at: 0)
mealamount.remove(at: 0)
if V2amount == 0
mealtype.remove(at: 1)
mealtime.remove(at: 1)
mealamount.remove(at: 1)
print (mealtype)
print (mealtime)
print (mealamount)
if let cell = tableView.dequeueReusableCell(withIdentifier: "confCell") as! confCell!
cell.confMealName.text = mealtype[(indexPath as NSIndexPath).row]
cell.confNN.text = mealtime[(indexPath as NSIndexPath).row]
cell.confAmount.text! = mealamount[(indexPath as NSIndexPath).row]
return cell
else
return confCell()
现在的问题是,如果只有一个 VAmount = 0,它工作得很好 我删除了数组中的索引,这样它就不会显示 tableview 单元格 但是如果有两个或多个 VAmount = 0
它只是表现得很奇怪,我猜是因为程序是从上到下执行的......而不是一次......
有谁能告诉我如何改进这段代码
我很确定有更好的方法来做到这一点! :/
【问题讨论】:
你真正想要什么?您不想在单元格中显示值 0 我建议您创建一个数据对象来表示每个单元格的内容(例如,使用字段:名称、时间、金额)。当您收到您的 json 时,将其相应地解析为数据对象列表。如果金额为空,请不要将其添加到列表中。这样,您可以在数据对象和表格视图的列表单元格之间进行 1-1 映射,即对于 numberOfRowsInSection,您可以简单地返回 list.count。对于 cellForRowAtIndexPath,您可以通过 list[indexPath.row] 获取数据对象,然后根据其值相应地呈现您的单元格。 @Jecky,是的。比如如果 type/A/noonAmount = 0,那么我将只有 5 行。它很容易拥有所有 6 行,我只是不知道如何显示值 > 0 的那些。 @kentoh,你认为我调用 dequereusalbeCell 来拥有所有 6 行,然后调用 deleteRow 删除那些有空值的行是个好主意还是不:/ Ian,最好不要对cellForRowAtIndexPath
方法中的数组执行操作,因为根据您拥有的行数,该方法会被多次调用。这可能会对您的程序性能造成不良影响。
【参考方案1】:
正如我在评论中所建议的,一种方法是创建一个数据对象来保存每个单元格的内容。这样,您就可以在数据对象和 tableview 的列表单元格之间进行 1-1 映射。
首先,创建一个数组来保存具有非零数量膳食的对象。这应该在您从数据库中获取 JSON 的地方完成(即不在cellForRowAtIndexPath
内)。为了简单起见,在这种情况下,我将使用 Swift 元组作为数据对象,但您始终可以使用普通的旧 Swift 对象。
// An array of Meal tuples, each of which can hold a type, time and amount)
var meals:[(type: String, time: String, amount: Double)] = []
对于每个餐点对象,如果金额为空,我们干脆不将其添加到数组中:
if v1amount > 0
meals.append((type: "TypeA", time: "lunch", amount: v1amount))
if v2amount > 0
meals.append((type: "TypeA", time: "dinner", amount: v2amount))
if v3amount > 0
meals.append((type: "TypeB", time: "lunch", amount: v3amount))
if v4amount > 0
meals.append((type: "TypeB", time: "dinner", amount: v4amount))
if v5amount > 0
meals.append((type: "TypeC", time: "lunch", amount: v5amount))
if v6amount > 0
meals.append((type: "TypeC", time: "dinner", amount: v6amount))
因为您的餐点数组和表格视图之间存在 1-1 映射,所以实现 numberOfRowsInSection
委托方法变得简单:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
// return the number of meals in your array
return meals.count
同样,对于cellForRowAtIndexPath
,您可以简单地从数组中相关索引处获取对象,并渲染其内容:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "confCell") as! confCell
// Get the meal object for this row
let meal = meals[indexPath.row]
// Populate the fields based on the meal's property
cell.confMealName.text = meal.type
cell.confNN.text = meal.time
cell.confAmount.text! = meal.amount
return cell
【讨论】:
嗨,kenton,你的逻辑很完美!!您的代码看起来就像我想要的那样,但 Xcode 一直在对我大喊“'AnyObject' 类型的值没有成员'时间'”错误。我不知道可能出了什么问题 哪一行?当您声明您的餐点数组时,请确保您还声明了数组所持有的对象类型,正如我上面的回答。 嗨,kenton,现在它完全可以工作了。非常感谢,我从你的代码中学到了很多东西!【参考方案2】:您的逻辑似乎没问题,只是您会收到编译错误,因为V1
、V2
等是在封闭范围内声明的。
我会建议这样的事情:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
var cellTotal = 6
guard AnoonAmount > 0 else cellTotal -= 1
guard ANightAmount > 0 else cellTotal -= 1
guard BnoonAmount > 0 else cellTotal -= 1
guard BNightAmount > 0 else cellTotal -= 1
guard CnoonAmount > 0 else cellTotal -= 1
guard CnightAmount > 0 else cellTotal -= 1
return cellTotal
【讨论】:
您好埃琳娜,感谢您的回复!看起来你的代码很有意义,我会试一试! anyidea 我如何 cellforrowat Indexpath 功能?谢谢 伊恩,为此你有很多posts。以上是关于Swift如何仅在我的数据库中有值时才显示表格视图单元格的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSPredicate 对表视图中的核心数据进行排序 (Swift)