如何在其他视图中重新加载 TableView?
How to reload TableView in other View?
我在我的 TableView 中使用了一些 CoreData 基础。
当我试图清除其他视图中的那些基础时,我的控制台日志中有一条消息。
CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.
Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). 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,但如何在其他视图中执行此操作?
我试过了,但是这段代码不起作用。
var tableViewHistoryClass = HistoryView()
self.tableViewHistoryClass.tableView.reloadData()
请帮助我修复此消息。
一种解决方案是在删除数据时通知您的表视图。
当数据被删除时,您的代码 post 通知:
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
}
您可以使用通知来实现。
在 viewDidLoad 方法中创建观察者,您可以在其中显示 table 视图数据。
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)
像这样它会重新加载您的 table 视图。
感谢大家的解答!
我创建了新方法,我将所有 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 警告
我在我的 TableView 中使用了一些 CoreData 基础。
当我试图清除其他视图中的那些基础时,我的控制台日志中有一条消息。
CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.
Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). 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,但如何在其他视图中执行此操作? 我试过了,但是这段代码不起作用。
var tableViewHistoryClass = HistoryView()
self.tableViewHistoryClass.tableView.reloadData()
请帮助我修复此消息。
一种解决方案是在删除数据时通知您的表视图。
当数据被删除时,您的代码 post 通知:
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
}
您可以使用通知来实现。
在 viewDidLoad 方法中创建观察者,您可以在其中显示 table 视图数据。
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)
像这样它会重新加载您的 table 视图。
感谢大家的解答! 我创建了新方法,我将所有 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 警告