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

Я хотел бы поместить два разных tableViewCells в один и тот же tableView, чтобы они всегда появлялись в паре. Первый tableViewCell должен отображать время начала и окончания, которые настраиваются пользователем. (возможно, datePicker) Второй tableViewCell должен отображать textField, который также можно редактировать. У обоих tableViewCells должна быть маленькая кнопка, которую можно либо проверить, либо нет. Я хотел бы хранить эти данные (время, текст, статус кнопки) где-нибудь.

Я установил структуру как dataType для обеих ячеек и создал массив. Я также настроил cellForRowAt, но при запуске приложения выдает ошибку.

Чтобы создать тип данных:

struct ScheduleCell{

    var id: Int
    var buttonState: Bool
    var text: String
    var time01: String
    var time02: String

}

Место для хранения данных:

var scheduleCellEntries: [ScheduleCell]! = [ScheduleCell(id: 2, buttonState: false, text: "Test", time01: "12:30", time02: "12:20"), ScheduleCell(id: 2, buttonState: false, text: "Test", time01: "12:30", time02: "12:20"), ScheduleCell(id: 2, buttonState: false, text: "Test", time01: "12:30", time02: "12:20"), ScheduleCell(id: 2, buttonState: false, text: "Test", time01: "12:30", time02: "12:20")]

Назначение количества строк:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        var count: Int?

        if tableView == scheduleTableView{
            count = scheduleCellEntries.count * 2

        }
    return count!
}

Загрузка данных в ячейки:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if tableView == scheduleTableView {

            if indexPath.row % 2 != 0{
                let cell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath) as! scheduleTableViewCell
                cell.scheduleTextField.text = scheduleCellEntries[indexPath.row].text


        return cell
}else{
        let cell = tableView.dequeueReusableCell(withIdentifier: "scheduleDateCell", for: indexPath) as! ScheduleDateTableViewCell


        return cell
}

Когда я запускаю приложение, я получаю следующую ошибку Thread 1: Fatal error: Index out of range!

1 Ответ

0 голосов
/ 19 мая 2019

Дело в том, что у вас есть X количество записей в scheduleCellEntries, но в два раза больше ячеек в вашей таблице, так как вы возвращаете scheduleCellEntries.count * 2cellForRowAt вместо использования indexPath.row для доступа к вашим данным в scheduleCellEntries следует использовать indexPath.row / 2, поэтому, когда таблица запрашивает данные для строк 0 и 1, выбираются те же данные.

Я немного изменяю ваш пример кода, добавляю переменную с соответствующим индексом, чтобы получить ваши данные let indexOnData = indexPath.row / 2 и использую ее для scheduleCellEntries.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if tableView == scheduleTableView {
        let indexOnData = indexPath.row / 2
        if indexPath.row % 2 != 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "scheduleCell", for: indexPath) as! scheduleTableViewCell
            cell.scheduleTextField.text = scheduleCellEntries[indexOnData].text
            return cell
        } else {
            let cell = tableView.dequeueReusableCell(withIdentifier: "scheduleDateCell", for: indexPath) as! ScheduleDateTableViewCell

        }
        return cell
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...