【问题标题】:How to reload TableView in other View?如何在其他视图中重新加载 TableView?
【发布时间】: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 已经在观察删除和崩溃,因为它们没有得到正确处理。你只需要配置它的委托方法,要么在删除每个对象时从表中删除行,要么重新加载表视图。

标签: swift core-data tableview reloaddata


【解决方案1】:

您可以通过使用通知来实现这一点。

  1. 在 viewDidLoad 方法中创建观察者,您可以在其中显示表格视图数据。

    override func viewDidLoad() {
        super.viewDidLoad()
    
        NSNotificationCenter.defaultCenter().addObserver(self, selector:"refreshTableView", name: "reloadTable", object: nil)
    
    }
    
    func refreshTableView () {
        self.tableView.reloadData()
    }
    
  2. 第二个视图控制器 -> 在此视图控制器中,您可以更改数据(如果您愿意)或发送数据对象

    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 警告

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 1970-01-01
      • 2012-04-05
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2013-05-28
      • 1970-01-01
      相关资源
      最近更新 更多