«Поток 1: фатальная ошибка: индекс вне диапазона в Swift» из TableView - PullRequest
0 голосов
/ 17 мая 2019

Я хочу получить данные из chipnumber2 и chipnumber.Я хочу собрать их в таблицу, но есть проблема.Как нарисовать данные из двух текстовых таблиц?"let deviceItem: Device3New = itemsNew [indexPath]". Я получаю эту проблему в строке.Короче говоря, я хочу нарисовать данные в Device3New и device3 в одной таблице.Как я могу это сделать?

class NewMainTableViewController: UITableViewController {
var items: [Device3] = []
    var itemsNew: [Device3New] = []

    let cellId: String = "cellId"
    let cellIdNew: String = "cellIdNew"

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(DeviceTableViewCell2.self, forCellReuseIdentifier: cellId)
}
 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


            if !chipnumber2.text!.isEmpty {

                let cellNew = tableView.dequeueReusableCell(withIdentifier: cellIdNew, for: indexPath) as! DeviceTableViewCell2

                let deviceItem: Device3New = itemsNew[indexPath.row]

                cellNew.badgeColor = UIColor.flatLime
                cellNew.badgeTextColor = .white;
                cellNew.badgeFontSize = 13;
                cellNew.badgeString = deviceItem.time
                cellNew.badgeOffset = CGPoint(x:30.0, y:63)

                cellNew.textLabel?.text = deviceItem.title

                cellNew.deviceItem3New = deviceItem
                cellNew.titleNew.text = deviceItem.title
                cellNew.title1New.text = deviceItem.places
                cellNew.titlesaatNew.text = deviceItem.time
                cellNew.buttonNew.isOn = deviceItem.state

                cellNew.tablerow = String (indexPath.row)

                cellNew.backgroundColor = UIColor(white: 1, alpha: 0.09)

                return cellNew


            }


             if !chipnumber.text!.isEmpty {
             let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! DeviceTableViewCell2

                let deviceItem: Device3 = items[indexPath.row]

                cell.badgeColor = UIColor.flatLime
                cell.badgeTextColor = .white;
                cell.badgeFontSize = 13;
                cell.badgeString = deviceItem.time
                cell.badgeOffset = CGPoint(x:30.0, y:63)
                cell.textLabel?.text = deviceItem.title

                cell.deviceItem3 = deviceItem
                cell.title.text = deviceItem.title
                cell.title1.text = deviceItem.places
                cell.titlesaat.text = deviceItem.time
                cell.button.isOn = deviceItem.state

                cell.tablerow = String (indexPath.row)


                cell.backgroundColor = UIColor(white: 1, alpha: 0.09)
                return cell
        }
return UITableViewCell()

    }
     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if !chipnumber2.text!.isEmpty {
            return itemsNew.count + items.count
        } else if !chipnumber.text!.isEmpty {
            return items.count
        }
        return 0

    }

1 Ответ

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

Проблема в том, что cellForRowAt пытается обработать сценарий, в котором есть два массива, но оба назначения deviceItem используют один и тот же indexPath.row в качестве индекса в соответствующем массиве.Но если items имеет два элемента, а newItems имеет три, то cellForRowAt будет вызываться пять раз, а значения indexPath.row находятся в диапазоне от 0 до 4. Но вы используете indexPath.row в обоих массивах, и поэтому выВы собираетесь выйти за границы массива для одного или обоих из items и newItems.

Самое простое решение состоит в том, чтобы иметь два раздела, один для items и другой для newItems,Это избавляет вас от необходимости выяснять, какой indexPath принадлежит какому массиву:

override func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
        return itemsNew.count
    } else {
        return items.count
    }
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cellNew = tableView.dequeueReusableCell(withIdentifier: cellIdNew, for: indexPath) as! DeviceTableViewCell2

        let deviceItem = itemsNew[indexPath.row]

        ...

        return cellNew
    } else {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! DeviceTableViewCell2

        let deviceItem = items[indexPath.row]

        ...

        return cell
    }
}

Обратите внимание, я не смотрю на текстовые поля.Выше предполагается, что вы просто заполните оба массива (и вызовете tableView.reloadData()).

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