2016-04-26 6 views
1

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

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

CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.
Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (0) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). 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() 

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

+1

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

ответ

0

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

1

Одним из решений является уведомление вашего табличного представления при удалении данных.

Когда данные удаляются ваш код почтовых уведомлений:

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

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

  1. создать наблюдателя в видеDidLoad, где вы можете отображать данные таблицы.

    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) 
    

    так, как это будет перезагрузить ваш вид таблицы ,

+0

Я удаляю свой ответ, это то же самое, что и вы :), этого ответа достаточно –

+0

Предупреждение в Swift 2.0 с использованием строкового литерала для селектора устарело. Вместо этого следует использовать #selector. – Mindsers

+0

Да, ты прав. но он будет работать для swift 1.2 –