如何在其他视图中重新加载TableView?

时间:2016-04-26 11:22:03

标签: swift core-data tableview reloaddata

我有一些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()

请帮我解决此问题。

3 个答案:

答案 0 :(得分:4)

您可以使用通知来实现此目的。

  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)
    

    所以这样会重新加载你的表视图。

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

相关问题