如何在其他视图中重新加载 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)

目标 C:如何突出显示 tableView 单元格并在重新加载表格时保持突出显示?

如何在单元格 Swift 2 中删除项目后重新加载表格视图

tableview 单元格内的集合视图重新加载数据

如何将 tableview 行保存到文件并重新加载到 tableview