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