我有一些CoreData基础,我在TableView中使用过。
当我尝试在其他视图中清除这些基础时,我在控制台日志中有一条消息。
CoreData:错误:严重的应用程序错误。在调用-controllerDidChangeContent期间,从NSFetchedResultsController的委托中捕获到异常:。
无效更新:第0节中的行数无效。更新(0)后现有部分中包含的行数必须等于更新前该部分中包含的行数(3),加上或减去数字从该部分插入或删除的行(0插入,0删除)和加或减移入或移出该部分的行数(0移入,0移出)。 with userInfo(null)
删除CoreData数组我使用此代码
self.historyArray.removeAll()
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "History")
fetchRequest.returnsObjectsAsFaults = false
do {
let results = try managedContext.executeFetchRequest(fetchRequest)
for managedObject in results
{
let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
managedContext.deleteObject(managedObjectData)
}
} catch {
print("Detele all data")
}
我知道我需要重新加载TableView,但是如何在其他View中执行此操作? 我试过这个,但这段代码不起作用。
var tableViewHistoryClass = HistoryView()
self.tableViewHistoryClass.tableView.reloadData()
请帮我解决此问题。
答案 0 :(得分:4)
您可以使用通知来实现此目的。
在viewDidLoad方法中创建观察者,您可以在其中显示表格视图数据。
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector:"refreshTableView", name: "reloadTable", object: nil)
}
func refreshTableView () {
self.tableView.reloadData()
}
第二个视图控制器 - >在此视图控制器中,您可以更改数据(如果要执行)或发送数据对象
NSNotificationCenter.defaultCenter().postNotificationName("reloadTable", object: nil)
所以这样会重新加载你的表视图。
答案 1 :(得分:1)
一种解决方案是在删除数据时通知您的tableview。
删除数据后,您的代码发布通知:
do {
let results = try managedContext.executeFetchRequest(fetchRequest)
for managedObject in results
{
let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
managedContext.deleteObject(managedObjectData)
NSNotificationCenter
.defaultCenter()
.postNotificationName("dataDeleted", object: self)
}
}
在控制器中你的tableview为这个通知添加一个观察者:
override func viewDidLoad() {
NSNotificationCenter
.defaultCenter()
.addObserver(
self,
selector: #selector(viewController.reloadTableView),
name: "dataDeleted",
object: nil)
}
func reloadTableView() {
self.tableview.reloadData
}
答案 2 :(得分:0)
谢谢大家的回答! 我创建了新的方法,我添加到我的View中的所有Clear CoreData函数,其中我有TableView用于显示来自CoreData的所有数据:P
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector:"clearCoreDataArray", name: "clearAllData", object: nil)
}
func clearCoreDataArray() {
historyArray.removeAll()
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "History")
fetchRequest.returnsObjectsAsFaults = false
do
{
let results = try managedContext.executeFetchRequest(fetchRequest)
for managedObject in results
{
let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
managedContext.deleteObject(managedObjectData)
}
} catch {
print("Detele all data")
}
self.tableView.reloadData()
}
在视图中,当我需要使用此方法时,我使用此代码
NSNotificationCenter.defaultCenter().postNotificationName("clearAllData", object: self)
现在我没有任何CoreData警告