如何根据不同条件在单个tableview中使用不同的同一个自定义单元格?

时间:2019-05-04 06:57:26

标签: swift uitableview

我有一个表格视图和一个自定义单元格。用户在上一个屏幕中有3个条件可供选择(成人,儿童和婴儿的数量)。

如何根据成人,儿童和婴儿的数量在表格视图中显示自定义单元格。 (假设用户选择了1名成人,2名儿童和3名婴儿) 单元格计数正常。我得到的细胞总数符合预期。

我尝试使用类似的东西

我在tableviewcontroller中声明了3个变量Adultcounttb,childcounttb和infantcounttb。

我在以前的屏幕上获得了成人数,儿童数和婴儿数

if(adultcounttb < adultcount )
{
let cell =  (declaring)
cell.titlelabel.text = "adult"
adultcounttb  += 1
return cell
}
else if (childcounttb < childcountt)
{
let cell =  (declaring)
cell.titlelabel.text = "child"
childcounttb += 1
return cell
}
else if .....



}
else
{
return UITableviewcell()
}

This works as intended but whenever i scroll , the cells just disappears and becomes blank ( i know its because the else part is getting called) . How can i fix it so that the cells dont disappear or go blank when tableview gets scrolled?

2 个答案:

答案 0 :(得分:1)

您似乎在实现表视图,就好像您正在编写C样式的for循环一样,使用XXXcounttb变量作为计数器。您永远不要这样做。

cellForRowAtIndexPath方法中,将给您一个indexPath,并且应该返回一个应该位于该索引路径的单元格。您的代码甚至都不在乎索引路径。这是您做错事情的一个重要指标。

实际上,您可以通过查看给定的索引路径和从先前的VC传递的XXXcount变量来算出应该返回哪个单元格。您完全不需要XXXcounttb变量。

假设您要在一个部分中显示所有单元格,则可以执行以下操作:

if indexPath.row < adultCount {
    // return an adult cell
} else if indexPath.row < adultCount + childCount {
    // return a child cell
} else {
    // return an infant cell
}

如果要在不同部分显示每种类型的单元格,则更加简单:

if indexPath.section == 0 {
    // return an adult cell
} else if indexPath.section == 1 {
    // return a child cell
} else {
    // return an infant cell
}

答案 1 :(得分:1)

更改您的自定义单元格,使其具有对这种类型的引用。并创建具有类型的init方法

class TableCell: UITableViewCell {
    enum PassengerType: String {
        case adult
        case child
        case infant
    }
    var currentPassengerType: PassengerType?

    let titlelabel = UILabel()
    let nameTxtField = UITextField()
    let ageTxtField = UITextField()

    init(passengerType: PassengerType) {
        super.init(style: .default, reuseIdentifier: nil)
        self.currentPassengerType = passengerType
    }
}

在UITableViewController类中,创建一个自定义单元格类的数组。在viewDidLoad中,根据从前一个视图控制器传递来的计数创建单元格。并在tableView数据源方法中使用此数组。

class TableVC: UITableViewController {

    var passengerCells = [TableCell]()
    var adultCount = 0
    var childCount = 0
    var infantCount = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        passengerCells += (0..<adultCount).map { _ in TableCell(passengerType: .adult) }
        passengerCells += (0..<childCount).map { _ in TableCell(passengerType: .child) }
        passengerCells += (0..<infantCount).map { _ in TableCell(passengerType: .infant) }
        tableView.reloadData()
    }
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return passengerCells.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = passengerCells[indexPath.row]
        cell.textLabel?.text = passengerCells[indexPath.row].currentPassengerType?.rawValue
        return cell
    }
    @objc func submitBtnAction(_ sender: UIButton) {
        passengerCells.forEach { cell in
            print(cell.currentPassengerType?.rawValue)
            print(cell.nameTxtField.text!)
            print(cell.ageTxtField.text!)
        }
    }
}

在submitBtnAction方法中,我已经打印了所有带有乘客类型信息的乘客详细信息。您可以在api中发送这些详细信息