如何在其他视图中重新加载 TableView?
Posted
技术标签:
【中文标题】如何在其他视图中重新加载 TableView?【英文标题】:How to reload TableView in other View? 【发布时间】:2016-04-26 11:22:02 【问题描述】:我在 TableView 中使用了一些 CoreData 基础。
当我试图在其他视图中清除这些基础时,我的控制台日志中有一条消息。
CoreData:错误:严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了异常。 无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (0) 必须等于更新前该节中包含的行数 (3),加上或减去数字从该部分插入或删除的行数(0 插入,0 删除)加上或减去移入或移出该部分的行数(0 移入,0 移出)。与 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()
请帮我修复这条消息。
【问题讨论】:
您不需要通知或委托。您的 NSFetchedResultsController 已经在观察删除和崩溃,因为它们没有得到正确处理。你只需要配置它的委托方法,要么在删除每个对象时从表中删除行,要么重新加载表视图。 【参考方案1】:您可以通过使用通知来实现这一点。
在 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)
这样它会重新加载您的表格视图。
【讨论】:
我删了我的答案,和你一样:),这个答案就够了 警告,在 Swift 2.0 中,不推荐使用字符串文字作为选择器。您应该改用#selector。 不使用您的代码,但我的控制台日志中仍有此消息 CoreData:错误:严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了异常。无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (0) 必须等于更新前该节中包含的行数 (1),加上或减去该数字从该部分插入或删除的行数(0 插入,0 删除)加上或减去移入或移出该部分的行数(0 移入,0 移出)。与 userInfo (null) 并且只有在我用 tableView 加载页面之前删除我的 CoreData 库中的所有数据【参考方案2】:一种解决方案是在删除数据时通知您的 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
【讨论】:
【参考方案3】:感谢大家的回答! 我创建了新方法,我将所有 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何重新加载 UIViewController 中包含的 tableView?
如何使用视图控制器重新加载 tableview (swift)