TableView reload funktioniert nicht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • TableView reload funktioniert nicht

    Hallo,

    ich bitte um Hilfe. Entweder bin ich blind, dass ich den Fehler nicht erkenne oder keine Ahnung.

    Ich habe eine einfache TableView wo verschiedensten Cell's mit Daten aus einer Datenbank gefüllt werden. Wenn ich auf den ViewController zurückkomme (von einer beliebigen anderen Ansicht) dann will ich, dass er die Datenbankabfrage welche ich in der Methode "getData" habe erneut ausführt und sich somit die aktuellsten Daten holt und danach die tableView refreshed. Soweit so gut, ich hab dafür gedacht, ich nehme die viewWillApear Methode. Allerdings ist das komische verhalten, dass wenn ich das Erstre mal auf die Ansicht zurückkomme noch die alten eintrage in der Tabelle sind. Wenn ich jedoch nochmal wegblicke und dann ein zweites mal zurückkomme, dann sind die neuen eintrage da. Kann mir bitte jemand erklären warum das so ist und wie ich es machen kann, dass von Anfang an die neuen Daten angezeigt werden?

    Hier mein Code:


    Quellcode

    1. class StartViewController: UITableViewController {
    2. var guestEntries:[GuestEntry] = []
    3. var indexClicked: Int = 0
    4. override func viewWillAppear(_ animated: Bool) {
    5. self.getData()
    6. self.tableView.reloadData()
    7. }
    8. override func viewDidLoad() {
    9. super.viewDidLoad()
    10. tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellIdentifier")
    11. self.getData()
    12. self.tableView.reloadData()
    13. }
    14. @IBAction func newGuest(_ sender: Any) {
    15. //Segue im Main.storyboard leitet automatisch weiter auf den AddGuestViewController
    16. }
    17. func getData(){
    18. let guests = PFQuery(className: "Guests")
    19. guests.order(byDescending: "Name")
    20. guests.findObjectsInBackground (block: { objects, error in
    21. if (error == nil) {
    22. self.guestEntries.removeAll()
    23. for object in objects! {
    24. let guestEntry = GuestEntry()
    25. guestEntry.objectId = object.objectId!
    26. guestEntry.name = object["Name"] as! String
    27. guestEntry.payed = (object["Payed"] as! Bool)
    28. guestEntry.wieselburger = object["Wieselburger"] as! Int
    29. guestEntry.schwechater = object["Schwechater"] as! Int
    30. self.guestEntries.append(guestEntry)
    31. }
    32. } else {
    33. if let descrip = error?.localizedDescription{
    34. self.displayErrorMessage(message: (descrip))
    35. }
    36. }
    37. DispatchQueue.main.async {
    38. self.tableView.reloadData()
    39. }
    40. })
    41. DispatchQueue.main.async {
    42. self.tableView.reloadData()
    43. }
    44. }
    45. override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    46. indexClicked = indexPath.row
    47. performSegue(withIdentifier: "showDetails", sender: self)
    48. }
    49. override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    50. if(segue.identifier == "showDetails") {
    51. let destVC : DetailViewController = segue.destination as! DetailViewController
    52. destVC.guestEntry = guestEntries[indexClicked]
    53. }
    54. }
    55. override func numberOfSections(in tableView: UITableView) -> Int {
    56. return 1
    57. }
    58. override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    59. return guestEntries.count
    60. }
    61. override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    62. let cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier", for: indexPath)
    63. if(guestEntries[indexPath.row].payed == false) {
    64. cell.textLabel?.textColor = .blue
    65. cell.textLabel?.text = guestEntries[indexPath.row].name
    66. }else{
    67. cell.textLabel?.textColor = .black
    68. cell.textLabel?.text = guestEntries[indexPath.row].name
    69. }
    70. return cell
    71. }
    Alles anzeigen
  • Du machst sehr viele self.tableView.reloadData(), die m. E. unnötig sind: Da das Füllen des Arrays guestEntries asynchron erfolgt, sollte ein Reload nach Hinzufügen aller Einträge reichen. Direkt nach dem Funktionsaufruf von getData() ist es zu früh - da das Lesen im Hintergrund noch nicht abgeschlossen wurde - und vielleicht auch kontraproduktiv: Ich bin mir nicht sicher, ob sich die vielen asynchronen Reloads nicht in's Gehege kommen können...

    Ich würde erst einmal alles auf ein Reload nach dem Array-Füllen reduzieren und dann weiter testen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Danke für den Tipp. Habe es nun so umgebaut, leider hat sich an der Situation nichts geändert. Die Daten sind erst beim zweiten Mal richtig in der Tabelle angezeigt.

    Ich habe aber rausgefunden, dass er die cellForRowAt beim einem self.tableView.reloadData() nicht aufruft. Aber genau die brauch ich, weil darin habe ich eine If Abfrage wo ich auf einen Wert abfrage, wen der true ist dann ist die Textfarbe in der Tabelle blau, wenn false dann schwarz.

    Hast du noch einen Tipp wie ich das lösen kann?

    Quellcode

    1. class StartViewController: UITableViewController {
    2. var guestEntries:[GuestEntry] = []
    3. var indexClicked: Int = 0
    4. var newEvent: String = ""
    5. override func viewWillAppear(_ animated: Bool) {
    6. self.getData()
    7. }
    8. override func viewDidLoad() {
    9. super.viewDidLoad()
    10. tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cellIdentifier")
    11. self.getData()
    12. }
    13. func getData(){
    14. let guests = PFQuery(className: "Guests")
    15. guests.order(byDescending: "Name")
    16. guests.findObjectsInBackground (block: { objects, error in
    17. if (error == nil) {
    18. self.guestEntries.removeAll()
    19. for object in objects! {
    20. let guestEntry = GuestEntry()
    21. guestEntry.objectId = object.objectId!
    22. guestEntry.name = object["Name"] as! String
    23. guestEntry.payed = (object["Payed"] as! Bool)
    24. guestEntry.wieselburger = object["Wieselburger"] as! Int
    25. guestEntry.schwechater = object["Schwechater"] as! Int
    26. guestEntry.energyDrink = object["EnergyDrink"] as! Int
    27. guestEntry.bacardi = object["Bacardi"] as! Int
    28. guestEntry.bacardiShot = object["BacardiShot"] as! Int
    29. guestEntry.baileys = object["Baileys"] as! Int
    30. guestEntry.bernardSpezialbier = object["BernardSpezialbier"] as! Int
    31. guestEntry.eierlikoer = object["Eierlikoer"] as! Int
    32. guestEntry.eistee = object["Eistee"] as! Int
    33. guestEntry.goesserRadler = object["GoesserRadler"] as! Int
    34. guestEntry.jaegermeister = object["Jaegermeister"] as! Int
    35. guestEntry.likoer = object["Likoer"] as! Int
    36. guestEntry.rum = object["Rum"] as! Int
    37. guestEntry.schnaps = object["Schnaps"] as! Int
    38. guestEntry.sprite = object["Sprite"] as! Int
    39. guestEntry.spritzer = object["Spritzer"] as! Int
    40. guestEntry.mineral = object["Mineral"] as! Int
    41. guestEntry.whiskey = object["Whiskey"] as! Int
    42. guestEntry.wodka = object["Wodka"] as! Int
    43. guestEntry.cola = object["Cola"] as! Int
    44. guestEntry.essen = object["Essen"] as! Int
    45. guestEntry.createdAt = object.createdAt!
    46. self.guestEntries.append(guestEntry)
    47. }
    48. DispatchQueue.main.async {
    49. self.tableView.reloadData()
    50. }
    51. } else {
    52. if let descrip = error?.localizedDescription{
    53. self.displayErrorMessage(message: (descrip))
    54. }
    55. }
    56. })
    57. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von fabian1302 ()