用于切换单元格的UITableView

时间:2017-12-20 09:27:00

标签: ios swift uitableview

我希望有一个包含2个单元格的tableview。

一个带有增加高度的标签和一个没有该标签的标签。用户将内容添加到此tableview(有点像待办事项列表),如果用户选择了一个选项,则标签在他们添加的新项目的tableviewcell中可见,但如果他们没有选择该选项,那么他们添加没有该标签的tableviewcell。无论如何,我可以选择何时显示带有标签的单元格。

我首先想到的是,如果未选择该选项,只会使标签不可见,但这会影响其他标签的高度和约束。

是否可以创建具有不同标识符的2个不同单元格,并根据是否选择了该选项来调用要添加的单元格。

根据解决方案,我尝试在两个不同的单元格之间切换,这是我的代码。

if newMode==true{
        let cell = tableView.dequeueReusableCell(withIdentifier: "monthlyCell", for: indexPath) as! MonthlyExpenseTableViewCell
        let screenSize: CGRect = UIScreen.main.bounds
        cell.dateLabelBackground.frame = CGRect(x: 0, y: 0, width: screenSize.width, height: 31)
        cell.dateLabel.text = dateString
        cell.expenseName2.text = expense.name
        cell.expenseAmount2.text = finalDisplayed
        cell.expenseCategory2.text = expense.category
        cell.expenseCollection2.text = expense.collection
        if (expense.expense) {
            cell.expenseAmount2.textColor = UIColor.red
        }


        else if (expense.income){
            cell.expenseAmount2.textColor = UIColor.green
        }

        if (expense.cash) && (expense.expense){
            cell.cashOrCredit.image = #imageLiteral(resourceName: "Cash-Expense Icon")

        }
        else if (expense.cash) && (expense.income){
            cell.cashOrCredit.image = #imageLiteral(resourceName: "Cash-Income Icon")

        }
        else if (expense.credit) && (expense.income){
            cell.cashOrCredit.image = #imageLiteral(resourceName: "Credit-Income Icon")

        }
        else if (expense.credit) && (expense.income){
            cell.cashOrCredit.image = #imageLiteral(resourceName: "Credit-Expense Icon")

        }
    }
    else if newMode==false{
        let cell = tableView.dequeueReusableCell(withIdentifier: "monthlyCell2", for: indexPath) as! MonthlyExpenseTableViewCellShort
        cell.expenseName3.text = expense.name
        cell.expenseAmount3.text = finalDisplayed
        cell.expenseCategory3.text = expense.category
        cell.expenseCollection3.text = expense.collection
        if (expense.expense) {
            cell.expenseAmount3.textColor = UIColor.red
        }


        else if (expense.income){
            cell.expenseAmount3.textColor = UIColor(red:0.49, green:0.83, blue:0.13, alpha:1.0)
        }

        if (expense.cash) && (expense.expense){
            cell.cashOrCredit3.image = #imageLiteral(resourceName: "Cash-Expense Icon")

        }
        else if (expense.cash) && (expense.income){
            cell.cashOrCredit3.image = #imageLiteral(resourceName: "Cash-Income Icon")

        }
        else if (expense.credit) && (expense.income){
            cell.cashOrCredit3.image = #imageLiteral(resourceName: "Credit-Income Icon")

        }
        else if (expense.credit) && (expense.income){
            cell.cashOrCredit3.image = #imageLiteral(resourceName: "Credit-Expense Icon")

        }
    }
    return cell

}

这个问题是,它只是出于某种原因一次只返回单元格。当我删除单元格时,它会显示下一个单元格。

以下是我设置布尔值“newMode”

的代码
if indexPath.row == 0{
        newMode = true
    }
    if indexPath.row>1{
    let previousExpensesData = monthlyExpenses[indexPath.row - 1].modificationDate
        let day = Calendar.current.component(.day, from: expense.modificationDate as! Date) // Do not add above 'date' value here, you might get some garbage value. I know the code is redundant. You can adjust that.
        let previousDay = Calendar.current.component(.day, from: monthlyExpenses[indexPath.row - 1].modificationDate! as Date)
        if day == previousDay {
            newMode = false
        } else {
            newMode = true
        }
    }

对于我的heightForRowAtIndexPath,我使用此代码

func tableView(_ tableView: UITableView,
               heightForRowAt indexPath: IndexPath) -> CGFloat
{
    if newMode==true {
            return 95
        }
        else if newMode==false {

            return 64
        }
        else {
            return 0
        }
}

这是numberOfRows的代码

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if monthlyExpenses.count == 0{
        noExpenseLabel.isHidden = false
    }
    return monthlyExpenses.count
}

以下是2个单元格的样子

enter image description here

1 个答案:

答案 0 :(得分:0)

实际上你不需要两个不同的细胞。正如您在问题中所说:“我首先想到的是,如果未选择该选项,只会使标签不可见,但这会影响其他标签的高度和约束。”

只需使用一个单元格。

现在要克服这个问题,在这个stackView中使用UIStackView.Put标签。为stackView提供适当的约束。并根据您的选项隐藏/取消隐藏标签。 UIStackView将为您完成这些任务。 :)

它会根据您的需要提供结果。有关UIStackView的更多信息,请阅读Raywenderlich的this awesome tutorial

编辑:根据您的评论

我创建了一个像这样的单元格。

enter image description here

我像这样管理了那个单元格的所有子视图..

enter image description here

我刚在cellForRow

中写了一行代码
cell.label.isHidden =  indexPath.row % 2 == 1

我得到了输出....

enter image description here