2016-04-26 12 views
1

Ich habe eine CoreData-Basis, die ich in meinem TableView verwende.Wie wird TableView in einer anderen Ansicht neu geladen?

Wenn ich versuche, diese Basis in anderen Ansicht zu löschen, habe ich eine Nachricht in meinem Konsolenprotokoll.

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)

zum Löschen Coredata Array ich diesen Code

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

Ich weiß, ich brauche Tableview nachladen verwendet, aber wie kann ich dies tun in anderen View? krank versucht dies, aber dieser Code funktioniert nicht.

var tableViewHistoryClass = HistoryView() 
self.tableViewHistoryClass.tableView.reloadData() 

Bitte helfen Sie mir, diese Nachricht zu beheben.

+1

Sie können entweder Benachrichtigungen oder Delegierten müssen. Ihr NSFetchedResultsController beobachtet bereits die Löschungen und Abstürze, weil sie nicht korrekt behandelt werden. Sie müssen nur seine Delegate-Methoden konfigurieren, um entweder Zeilen aus der Tabelle zu löschen, wenn jedes Objekt gelöscht wird, oder die Tabellenansicht neu zu laden. – pbasdf

Antwort

0

Vielen Dank für Antworten! ich neue Methode erstellt, die alle meine löschen Coredata Funktion i meiner Ansicht hinzugefügt, in denen ich Tableview haben für alle Daten von Coredata zeigt: 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() 
} 

und in Aussicht, wenn ich brauche diese Methode zu verwenden, ich benutze diesen Code

NSNotificationCenter.defaultCenter().postNotificationName("clearAllData", object: self) 

jetzt habe ich keine Warnungen Coredata

1

Eine Lösung besteht darin, Ihre Tabellenansicht zu benachrichtigen, wenn Daten entfernt werden.

Wenn Daten Code Post-Benachrichtigungen entfernt wird:

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

Und in Controller, wo ist Ihr Tableview einen Beobachter für diese Meldung hinzufügen:

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

func reloadTableView() { 
    self.tableview.reloadData 
} 
4

Sie können dies erreichen, indem Benachrichtigung verwendet wird.

  1. create observer in der viewDidLoad-Methode, in der Sie Ihre Tabellensichtdaten anzeigen können.

    override func viewDidLoad() { 
        super.viewDidLoad() 
    
        NSNotificationCenter.defaultCenter().addObserver(self, selector:"refreshTableView", name: "reloadTable", object: nil) 
    
    } 
    
    func refreshTableView() { 
        self.tableView.reloadData() 
    } 
    
  2. Second-View-Controller -> In diesem View-Controller können Sie Ihre Daten ändern (wenn Sie wollen) oder Daten

    Objekt senden
    NSNotificationCenter.defaultCenter().postNotificationName("reloadTable", object: nil) 
    

    so wie diese wird es Ihre Tabellenansicht neu zu laden .

+0

Ich lösche meine Antwort, es ist das gleiche wie du :), diese Antwort ist genug –

+0

Warnung, in Swift 2.0 mit String-Literal für Selektor ist veraltet. Sie sollten stattdessen #selector verwenden. – Mindsers

+0

Ja, Sie sind wahr. aber es wird für schnelle arbeiten 1.2 –