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】:

您的逻辑似乎没问题,只是您会收到编译错误,因为V1V2 等是在封闭范围内声明的。

我会建议这样的事情:

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如何仅在我的数据库中有值时才显示表格视图单元格的主要内容,如果未能解决你的问题,请参考以下文章

仅当它在 AngularJs 中有值时才需要下拉

希望 Where 子句中的“存在”仅在传递的参数有值时使用

如何设置表格视图以仅在 ios 中显示单行?

使用 NSPredicate 对表视图中的核心数据进行排序 (Swift)

文件上传进度的通知观察者模式仅在文件很大时才有效 - swift?

使用 Swift 在表格视图中重新加载单元格数据