从表格视图中删除一行

问题描述:

我想从表格视图中删除一行,但出现此错误: ***由于未捕获的异常'NSInternalInconsistencyException',原因:'无效的更新:无效的数字。更新(4)后,现有节中包含的行数必须等于更新前该节中包含的行数(4),加上或减去插入或删除的行数从该部分(0插入,1删除)和加或减去移入或移出该部分的行数(0移入,0移出)。从表格视图中删除一行

这是我的代码:

import UIKit 
import CoreData 

class VehiclesTableViewController: UITableViewController { 

    // MARK: - Model 
    var vehiclesStored = [Array<Vehicle>]() { 
     didSet { 
      tableView.reloadData() 
     } 
    } 

    var managedObjectContext: NSManagedObjectContext? = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext 

    // MARK: - Lifecycle methods 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     vehiclesStored.removeAll() 
     vehiclesStored.insert(Vehicle.fetchVehicles(inManagedObjectContext: managedObjectContext!)!, at: 0) 

     navigationItem.title = String(vehiclesStored[0].count) + " Vehicles" 
     // Uncomment the following line to preserve selection between presentations 
     // self.clearsSelectionOnViewWillAppear = false 

     // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
     self.navigationItem.leftBarButtonItem = self.editButtonItem 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Table view data source 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return vehiclesStored.count 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of rows 
     return vehiclesStored[section].count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "vehiclesList", for: indexPath) 

     // Configure the cell... 
     let vehicles = vehiclesStored[indexPath.section][indexPath.row] 
     cell.textLabel?.text = (vehicles.id_brand_model?.id_model?.brand)! + ", " + (vehicles.id_brand_model?.model)! + ", " + (vehicles.id_vehicle_type?.type)! 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "EEE, dd MMM yyy hh:mm:ss" 
     cell.detailTextLabel?.text = String(vehicles.id as! Int64) + ", " + vehicles.licence_plate! + ", " + (vehicles.id_color?.color_description)! + ", " + dateFormatter.string(from:vehicles.date as! Date) 

     return cell 
    } 

    // Override to support conditional editing of the table view. 
    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the specified item to be editable. 
     return true 
    } 

    // Override to support editing the table view. 
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == .delete { 
      // Delete the row from the data source 
      vehiclesStored[0].remove(at: indexPath.row) 
      tableView.deleteRows(at: [indexPath], with: .fade) 
     } else if editingStyle == .insert { 
      // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view 
     }  
    } 

    /* 
    // Override to support rearranging the table view. 
    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) { 

    } 
    */ 

    /* 
    // Override to support conditional rearranging of the table view. 
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { 
     // Return false if you do not want the item to be re-orderable. 
     return true 
    } 
    */ 


    // MARK: - Navigation 

    @IBAction func unwindVehicleList(sender: UIStoryboardSegue) { 
     if let sourceViewController = sender.source as? VehicleAddViewController { 
      if let vehicles = sourceViewController.vehicle { 
       if let selectedIndexPath = tableView.indexPathForSelectedRow { 
        // Update an existing vehicle. 
        vehiclesStored[selectedIndexPath.section][selectedIndexPath.row] = vehicles 
        tableView.reloadRows(at: [selectedIndexPath], with: .none) 
       } 
       else { 
        // Add a new vehicle. 
        vehiclesStored.removeAll() 
        vehiclesStored.insert(Vehicle.fetchVehicles(inManagedObjectContext: managedObjectContext!)!, at: 0) 
        tableView.reloadData() 
       } 
      } 
     } 
    } 

    // a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
     if segue.identifier != nil { 
      if segue.identifier == "Show Detail" { 
       let vehicleDetailViewController = segue.destination as! VehicleAddViewController 

       // Get the cell that generated this segue. 
       if let selectedVehicleCell = sender as? UITableViewCell { 
        let indexPath = tableView.indexPath(for: selectedVehicleCell)! 
        let selectedVehicle = vehiclesStored[indexPath.section][indexPath.row] 
        vehicleDetailViewController.vehicle = selectedVehicle 
       } 
      } 
      else if segue.identifier == "Add Item" { 
       print("Adding new vehicle.") 
      } 
     } 
    } 


} 

这是为什么?

+0

你在numberOfRows返回部分'vehiclesStored [段]'的同时被检测到没有变化? – Larme

+0

是的,返回车辆存储[部分] .count,在覆盖函数tableView –

+0

请,你可以显示你设置你的tableview的整个代码? – mursang

我的问题是在我的变种,它被重新加载数据的didSet和删除行