Проблема в том, что 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()
).