Как перезагрузить TableView в другом представлении?

У меня есть база CoreData, которую я использую в своем TableView.

Когда я пытаюсь очистить эту базу в другом представлении, в моем журнале консоли появляется сообщение.

CoreData: ошибка: серьезная ошибка приложения. Было обнаружено исключение от делегата NSFetchedResultsController во время вызова -controllerDidChangeContent :.
Недействительное обновление: недопустимое количество строк в разделе 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()

Пожалуйста, помогите мне исправить это сообщение.


person Skie    schedule 26.04.2016    source источник
comment
Вам не нужны ни уведомления, ни делегаты. Ваш NSFetchedResultsController уже наблюдает за удалениями и сбоями, потому что они не обрабатываются правильно. Вам просто нужно настроить его методы делегата, чтобы либо удалять строки из таблицы при удалении каждого объекта, либо перезагружать представление таблицы.   -  person pbasdf    schedule 26.04.2016


Ответы (3)


Вы можете добиться этого с помощью уведомления.

  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)
    

    так что он перезагрузит вашу таблицу.

person pradeepchauhan_pc    schedule 26.04.2016
comment
Удаляю свой ответ, он такой же как у вас :), этого ответа хватит - person Alessandro Ornano; 26.04.2016
comment
Предупреждение, в Swift 2.0 использование строкового литерала для селектора устарело. Вместо этого вы должны использовать #selector. - person Mindsers; 26.04.2016
comment
плохо использую ваш код, но это сообщение все еще есть в моем журнале консоли - person Skie; 27.04.2016
comment
CoreData: ошибка: серьезная ошибка приложения. Было обнаружено исключение от делегата NSFetchedResultsController во время вызова -controllerDidChangeContent :. Недопустимое обновление: недопустимое количество строк в разделе 0. Количество строк, содержащихся в существующем разделе после обновления (0), должно быть равно количеству строк, содержащихся в этом разделе до обновления (1), плюс или минус число. строк, вставленных или удаленных из этого раздела (0 вставлено, 0 удалено), и плюс или минус количество строк, перемещенных в или из этого раздела (0 перемещено, 0 перемещено). с userInfo (null) - person Skie; 27.04.2016
comment
и только если я загружу страницу с помощью tableView, прежде чем я удалю все данные в моей базе CoreData - person Skie; 27.04.2016
comment
проверьте свой источник данных. потому что это правильный подход. - person pradeepchauhan_pc; 27.04.2016
comment
Вы обновляете какие-либо данные из другого контроллера представления? - person pradeepchauhan_pc; 27.04.2016
comment
когда я использую tableView и удаляю все данные из базы CoreData в одном ViewController, у меня нет ошибок, это сообщение я вижу только тогда, когда пытаюсь удалить все данные в базе CoreData во втором ViewController, в котором у меня нет TableView Я использую этот код в ViewController с TableView NSNotificationCenter.defaultCenter().addObserver(self, selector: "tableReload", name: "relodTableView", object: nil) в viewDidLoad () и добавляю эту функцию func tableReload() { tableView.reloadData() } - person Skie; 27.04.2016
comment
и в ViewController, в котором плохо удаляются все данные, которые я использую NSNotificationCenter.defaultCenter().postNotificationName("relodTableView", object: self) - person Skie; 27.04.2016
comment
вам нужно получить данные из базы данных. и перезагрузи свой стол - person pradeepchauhan_pc; 27.04.2016
comment
bcoz, когда вы удаляете данные из другого контроллера представления. он удаляется из вашей базы данных. но вам нужно перезагрузить источник данных. - person pradeepchauhan_pc; 27.04.2016

Одно из решений - уведомить вашу таблицу об удалении данных.

Когда данные удаляются, уведомления о публикации кода:

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)
    }
}

И в контроллере, где находится ваша таблица, добавьте наблюдателя для этого уведомления:

 override func viewDidLoad() {
     NSNotificationCenter
         .defaultCenter()
         .addObserver(
             self, 
             selector: #selector(viewController.reloadTableView), 
             name: "dataDeleted", 
             object: nil)
 }

 func reloadTableView() {
     self.tableview.reloadData
 }
person Mindsers    schedule 26.04.2016

Спасибо всем за ответы! Я создал новый метод, всю свою функцию 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

person Skie    schedule 27.04.2016