我有一个表格视图和一个自定义单元格。用户在上一个屏幕中有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?
答案 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中发送这些详细信息