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

Swift 如何根据不同的条件在单个tableview中使用相同的自定义单元格?,swift,uitableview,Swift,Uitableview,我有一个tableview和一个自定义单元格。我有3个用户在上一屏幕中选择的条件(成人、儿童和婴儿的数量) 如何根据成人、儿童和婴儿的数量在tableview中显示自定义单元格。 (假设用户选择1名成人、2名儿童和3名婴儿) 细胞计数工作正常。我得到的单元格总数与预期一致 我试过用类似的东西 我在tableviewcontroller中声明了3个变量adultcounttb、childcounttb、infantcounttb 我从上一个屏幕中获得了成人计数、儿童计数和婴儿计数 if(adult

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

如何根据成人、儿童和婴儿的数量在tableview中显示自定义单元格。 (假设用户选择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?
if(adultcounttb
您似乎在实现一个表视图,就好像在编写一个C风格的for循环,使用
XXXcounttb
变量作为计数器。你不应该这样做

cellforrowatinexpath
方法中,将为您提供一个
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
}

将自定义单元格更改为对其类型的引用,如下所示。并创建类型为的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!)
        }
    }
}
class TableVC:UITableViewController{
var passengerCells=[TableCell]()
var ADULCOUNT=0
var childCount=0
变量婴儿计数=0
重写func viewDidLoad(){
super.viewDidLoad()
passengerCells+=(0..UITableViewCell{
让cell=passengerCells[indexPath.row]
cell.textLabel?.text=passengerCells[indexath.row].currentPassengerType?.rawValue
返回单元
}
@objc func submitBtnAction(uu发送方:ui按钮){
passengerCells.forEach{cell在
打印(单元格.currentPassengerType?.rawValue)
打印(cell.nameTxtField.text!)
打印(cell.ageTxtField.text!)
}
}
}

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

@RajeshKumar R基本上是3个变量,以确保我获得每种类型所需的单元格数。(如1个成人、2个儿童、4个婴儿).是否有更好的方法显示X个成人细胞数、Y个儿童细胞数和Z个婴儿细胞数(X Y Z由用户在上一屏幕中选择)哇,非常感谢。我花了半天时间思考如何解决这个问题。这很有意义,如果可以的话,我还有另一个问题。每个单元格有4个字段,用户在这4个字段中键入。我想保存这些字段中的任何用户类型。(假设1个成人单元格、2个儿童单元格和3个婴儿单元格。用户在第一个单元格0中输入成人的详细信息,在第1个单元格和第2个单元格中输入儿童的详细信息,在第3个单元格、第4个单元格和第5个单元格中输入婴儿的详细信息)如何分别保存每个人的详细信息?(我正在尝试使用alamofire将每个人的详细信息发送到服务器)@Zyfe3r您似乎正在制作表单。这可能会让您的生活更轻松。如果您有新问题,请发布新问题,而不是在评论中提问。我将在测试此代码后立即将您的问题标记为已回答:)我得到(对运算符函数的模糊引用)
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!)
        }
    }
}