2017-08-04 1 views
0

Ich habe eine TableView, die Daten aus Kerndaten übernehmen.Swift TableView Neue Zeile einfügen

Sobald die Daten gespeichert sind, werden sie als erste Zeile eingefügt.

Hier ist der Code, den ich verwende, um die Daten zu speichern (ich benutze nicht den Abrufcontroller, weil ich keine Daten abrufe, sondern nur sie lade, weil das Datum von einer geladen wird eine zu viele Beziehung)

swimToConnect.addToMaterialsLocal(materialLocal) 
    ad.saveContext() 

     // Adding the new row to update the tableView 
     let MyMaterialsVC = self.presentingViewController?.presentingViewController?.presentingViewController as! MyMaterialsVC 
     MyMaterialsVC.myMaterials.insert(materialLocal, at: 0) 
     MyMaterialsVC.tableView.insertRows(at: [NSIndexPath(row: 0, section: 0) as IndexPath], with: .none) 
     MyMaterialsVC.dismiss(animated: true, completion: nil) 
    } 

So fragte ich mich, ob es eine Möglichkeit gibt, die Reihe nach Datum geordnet einzufügen. Ich habe sie nach Datum geordnet wie folgt:

var swim: SwimminPool! { 
    didSet { 
     myMaterials = (swim.materialsLocal?.allObjects as! [MaterialLocal]).sorted(by: {$0.createdAtLocal! > $1.createdAtLocal!}) 
    } 
} 

wo aufgestellt ist ein Datum, von dem Benutzer mit einem Datumsauswahl hinzugefügt. Wenn ich die neuen Daten speichere, werden sie offensichtlich in der ersten Zeile angezeigt, aber wenn ich den Controller verlasse und dann wieder reinkomme, werden die Daten entsprechend der Datumsreihenfolge angezeigt.

Gibt es eine Möglichkeit, die Daten sofort nach dem Speichern in der richtigen Reihenfolge zu bestellen?

Vielen Dank.

+0

, warum Sie die Tabellenansicht nicht nachladen kurz nach dem Hinzufügen von Daten. Wie ich verstanden habe, wenn Sie die Ansicht laden, zeigt die Tabellenansicht die Daten nach Datum geordnet an. Anstatt also die Zeile in die Tabellenansicht einzufügen, speichern Sie einfach die Daten in den Kerndaten und laden die Tabellenansicht danach erneut –

+0

Sie wollen diese zwei Zeilen entfernen: MyMaterialsVC.myMaterials.insert (materialLocal, at: 0) MyMaterialsVC.tableView .insertRows (at: [NSIndexPath (Zeile: 0, Abschnitt: 0) als IndexPath], mit: .none) – Marco

+0

Wenn Sie es in den Stammdaten speichern und die Sortierung anwenden, können Sie die Daten direkt danach erneut laden Tabellenansicht, deren Datenquelle Ihre Kerndaten sind. –

Antwort

0

diese Änderung

swimToConnect.addToMaterialsLocal(materialLocal) 
    ad.saveContext() 

     // Adding the new row to update the tableView 
     let MyMaterialsVC = self.presentingViewController?.presentingViewController?.presentingViewController as! MyMaterialsVC 
     MyMaterialsVC.myMaterials.insert(materialLocal, at: 0) 
     MyMaterialsVC.myMaterials = (swim.materialsLocal?.allObjects as! [MaterialLocal]).sorted(by: {$0.createdAtLocal! > $1.createdAtLocal!}) 
     MyMaterialsVC.tableView.reloadData() 
     MyMaterialsVC.dismiss(animated: true, completion: nil) 
    } 
+0

es zeigt immer noch das Element als erstes beim Entlassen nach dem Speichern ... und dann in der richtigen Position, wenn ich gehe und zurück zum Tabellenansicht – Marco

+0

das funktioniert jetzt perfekt! Danke! :) – Marco

+0

froh, dass es geholfen @Marco –

0

Der beste Weg für dieses Problem und die effizienteste zu finden NSFetchedResultsController zu verwenden. Es kümmert sich um das effiziente Einfügen und Löschen von Elementen und sortiert sie mit NSPredicate. Sie können eine Master-Detail-Anwendungsvorlage in Xcode erstellen und das Kontrollkästchen für Core-Daten aktivieren, dann erstellt Xcode eine Beispiel-App mit FetchedResultsController, in der Sie sehen können, wie es funktioniert.

+0

ich bin neu zu swift, so dass ich immer noch übe ... ich benutze die fetchereult Controller, um die Haupteinheit zu bekommen ... aber ich würde nicht wissen, wie man es benutzt, wenn man die one to many .. – Marco

+0

Sie erstellen eine Instanz von 'FetchedResultController' und Sie legen eine Entität dafür fest. Es kann nur eine Entität anzeigen.Normalerweise zeigen Sie eine einzelne Entity als Ihre Tabellenansichtszeilen an. Wenn Sie Beziehungswerte erhalten möchten, fragen Sie 'frc', um Ihnen die Entity zu geben und die Dot-Nation wie (' myBook.author') zu verwenden, um ihre Beziehung zu erhalten ein Array von Objekten. – Alan

0

Dies ist eine kleine generische Funktion, die den Einfüge-Index in einem sortierten Array für ein neues Element zurückgibt. Der Vorteil ist, dass Sie nicht die gesamte Tabellenansicht neu laden müssen.

func orderedInsertIndex<T : Comparable>(array: [T], item: T) -> Int { 
    var index = array.count 
    while index > 0 && item < array[index-1] { 
     index -= 1 
    } 
    return index 
} 

Und Sie können es verwenden:

let insertionIndex = orderedInsertIndex(array: MyMaterialsVC.myMaterials.map{ $0.createdAtLocal! }, item: materialLocal.createdAtLocal!) 
MyMaterialsVC.myMaterials.insert(materialLocal, at: insertionIndex) 
MyMaterialsVC.tableView.insertRows(at: [IndexPath(row: insertionIndex, section: 0)], with: .none) 
MyMaterialsVC.dismiss(animated: true, completion: nil) 

Randbemerkung: Es ist eine native Struktur IndexPath in Swift 3

+0

hey Vadian! Danke!! hilft mir immer! :) – Marco