【发布时间】:2017-11-22 17:58:00
【问题描述】:
这是线程: '无效更新:第0节中的行数无效。更新后现有节中包含的行数(19)必须等于更新前该节中包含的行数(19),加上或减去从该部分插入或删除的行数(0 插入,1 删除)加上或减去移入或移出该部分的行数(0 移入,0 移出)。'
这是删除行的代码
import UIKit
import CoreData
import Foundation
class TableViewController: UITableViewController {
@IBOutlet weak var tableShow: UITableView!
var person = [NSManagedObject]()
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = editButtonItem
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
do {
let results = try managedContext.fetch(fetchRequest)
person = results as! [NSManagedObject]
} catch let error as NSError {
print("Fetching Error: \(error.userInfo)")
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return person.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let personA = person[indexPath.row]
let firstName = personA.value(forKey: "firstName")
let lastName = personA.value(forKey: "lastName")
let age = personA.value(forKey: "age")
if age != nil {
cell.textLabel?.text = "\(firstName!) \(lastName!), age \(age!)"
}
else {
cell.textLabel?.text = "\(firstName!) \(lastName!)"
}
return cell
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
var all = [[person]]
all[indexPath.section].remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath] , with: .fade)
// tableView.reloadData()
}
}
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
if editing {
tableView.setEditing(true, animated: true)
} else {
tableView.setEditing(false, animated: true)
}
}
}
【问题讨论】:
-
不要在委托函数中调用
tableView.deleteRows,尝试从托管对象中移除元素,然后只调用tableView.reloadData() -
显示您的
numberOfRowsInSection代码。您显示的代码告诉 tableview 您正在删除一行,但它不会更新您的实际数据存储,因此您会崩溃。此外,您应该致电deleteRows(这是首选)或致电reloadData。调用两者是多余的。 -
我尝试了,但同样的问题我想提供所有代码,请编辑代码
-
您正在从刚刚在委托方法范围内初始化的数组
all中删除时间。您需要从数据源中删除person数组
标签: ios uitableview core-data swift4