Как я могу использовать одну и ту же пользовательскую ячейку в одном табличном представлении по-разному в зависимости от различных условий? - PullRequest
2 голосов
/ 04 мая 2019

У меня есть таблица и пользовательская ячейка. У меня есть 3 условия, которые пользователь выбирает на предыдущем экране (количество взрослых, детей и младенцев).

Как представить пользовательскую ячейку в виде таблицы в зависимости от количества взрослых, детей и младенцев. (допустим, пользователь выбирает 1 взрослого, 2 детей и 3 младенца) Количество клеток работает нормально. Общее количество ячеек соответствует ожидаемому.

Я пытался использовать что-то вроде

я объявил 3 переменные adultcounttb, childcounttb, infantcounttb в tableviewcontroller.

У меня есть счет взрослого, ребенка и ребенка с предыдущего экрана

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 ]

1 голос
/ 04 мая 2019

Измените свою пользовательскую ячейку, чтобы иметь ссылку на ее тип, подобный этому.И создайте метод 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

1 голос
/ 04 мая 2019

Похоже, вы реализуете табличное представление, как будто вы пишете цикл в стиле C с переменными XXXcounttb в качестве счетчиков. Вы никогда не должны этого делать.

В методе cellForRowAtIndexPath вам дается indexPath, и вы должны вернуть ячейку, которая должна быть по указанному пути индекса. Ваш код даже не заботится о пути индекса. Это большой показатель того, что вы делаете что-то не так.

Фактически, вы можете определить, какая ячейка должна быть возвращена, просто взглянув на заданный путь индекса и переменные XXXcount, переданные из предыдущего VC. Вам не нужны переменные 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...