Ошибка при удалении элементов из двумерного массива - PullRequest
0 голосов
/ 03 августа 2020

Следующий код успешно заполняет таблицу Cars и группирует их по Category то, что мне не удалось сделать, так это удалить последний элемент из раздела. Когда есть несколько элементов, я могу успешно удалить их все, кроме последнего; на последнем я получаю сообщение об ошибке.

CODE

class Car{
    var make = ""
    var model = ""
    var category = ""
    var isActive = false
    
    init(make:String, model:String, category:String, isActive:Bool) {
        self.make = make
        self.model = model
        self.category = category
        self.isActive = isActive
    }
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    @IBOutlet weak var myTable: UITableView!    
    
    var carsFromRealmDatabase:[Car] = [Car(make:"Ford", model:"Mustang", category: "Sport", isActive: false),
                    Car(make:"Ford", model:"Escort", category: "Sport", isActive: false),
                    Car(make:"Chevy", model:"Camaro", category: "Sedan", isActive: false),
                    Car(make:"Volkswagen", model:"Jetta", category: "Sedan", isActive: false),
                    Car(make:"Tesla", model:"Model S", category: "Sporty", isActive: false),
                    Car(make:"Tesla", model:"Cybertruck", category: "Pickup", isActive: false),]
    
    var sections : [[Car]] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        createSectionsFromCars()
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCustomCell", for: indexPath) as! MyCustomCell
        cell.textLabel!.text = sections[indexPath.section][indexPath.row].model
        return cell
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sections[section][0].category
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 40
    }
    
    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

        //  DELETE action
        let delete = UITableViewRowAction(style: .destructive, title: "Delete") { action, index in
            self.carsFromRealmDatabase.remove(at: indexPath.row)
            self.createSectionsFromCars()
            tableView.deleteRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
            self.myTable.reloadData()
        }
        return [delete]
    }
    
    func createSectionsFromCars(){
        // temporary Dictionary to be able to group cars by category.
        var sectionForCategory:Dictionary = [String: [Car]]()
        
        // add groups of arrays from Dictionary to sections array.
        for car in carsFromRealmDatabase {
            if sectionForCategory[car.category] == nil {
                sectionForCategory[car.category] = []
            }
            sectionForCategory[car.category]!.append(car)
        }
        sections = sectionForCategory.keys.sorted().map({ sectionForCategory[$0]! })
    }
}

ERROR

Thread 1: Exception: «Недопустимое обновление: недопустимое количество разделов. количество разделов, содержащихся в табличном представлении после обновления (3), должно быть равно количеству разделов, содержащихся в табличном представлении до обновления (4), плюс или минус количество вставленных или удаленных разделов (0 вставлено, 0 удалено ). "

В Image 1 мне удалось удалить Escort без проблем, но в Image 2 я получил ошибку при попытке удалить Mustang.

введите описание изображения здесь

Что мне не хватает?

1 Ответ

1 голос
/ 03 августа 2020

Как предположил Paulw11 в своем комментарии, вам не хватает обработчика для удаления раздела. Итак, поиграв немного с вашим кодом, я получил что-то вроде этого для метода editActionsForRowAt:

    func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {

        //  DELETE action
        let delete = UITableViewRowAction(style: .destructive, title: "Delete") { action, index in
            self.sections[indexPath.section].remove(at: indexPath.row)

            if self.sections[indexPath.section].count == 0 {
                self.sections.remove(at: indexPath.section)

                let indexSet = IndexSet(arrayLiteral: indexPath.section)
                tableView.deleteSections(indexSet, with: .automatic)
            } else {
                tableView.deleteRows(at: [indexPath],
                                     with: UITableView.RowAnimation.automatic)
            }
        }
        return [delete]
    }

, где я заменил манипуляции с carsFromRealmDatabase и добавил обработчики удаления из sections напрямую

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