Problem bei der Erstellung des IndexPath eines Table Views

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • Problem bei der Erstellung des IndexPath eines Table Views

    Guten morgen zusammen,

    ich bin aktuell dabei einen TableView mit Parse zu Verbinden. Soweit ist alles fertig, leider kommt jedoch eine Fehlermeldung beim ausfüllen der Zellen, hier der Code der Datei:

    Quellcode

    1. import UIKit
    2. import Parse
    3. class NewsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    4. private var reuseIdentifer = "NewsCell"
    5. var titleLabel: UILabel!
    6. var backButton: UIButton!
    7. var tableView: UITableView!
    8. var user: [String] = [String]()
    9. var descriptions = [String]()
    10. var content = [String]()
    11. var time = [String]()
    12. override func viewDidLoad() {
    13. super.viewDidLoad()
    14. view.backgroundColor = .white
    15. createViewControllerItems()
    16. retrieveUser()
    17. retrieveDescription()
    18. retrieveContent()
    19. retrieveTime()
    20. }
    21. func createViewControllerItems() {
    22. //gekürzt
    23. }
    24. @objc func backSettings() {
    25. let vc: SettingsViewController!
    26. vc = SettingsViewController()
    27. vc.modalPresentationStyle = .fullScreen
    28. present(vc, animated: true)
    29. }
    30. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    31. return user.count
    32. }
    33. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    34. let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifer, for: indexPath) as! NewsCell
    35. cell.postName.text = self.user[indexPath.row]
    36. cell.descriptionLabel.text = self.descriptions[indexPath.row] (FEHLER!!!)
    37. cell.contentLabel.text = self.content[indexPath.row]
    38. cell.timeLabel.text = self.time[indexPath.row]
    39. return cell
    40. }
    41. @objc func retrieveUser() {
    42. var query:PFQuery = PFQuery(className: "News")
    43. query.findObjectsInBackground { (objects:[AnyObject]!, error:Error!) -> Void in
    44. self.user = [String]()
    45. for news in objects {
    46. self.user.append(news["user"] as! String)
    47. }
    48. self.tableView.reloadData()
    49. }
    50. }
    51. @objc func retrieveDescription() {
    52. var query:PFQuery = PFQuery(className: "News")
    53. query.findObjectsInBackground { (objects:[AnyObject]!, error:Error!) -> Void in
    54. self.descriptions = [String]()
    55. for description in objects {
    56. self.user.append(description["description"] as! String)
    57. }
    58. self.tableView.reloadData()
    59. }
    60. }
    61. @objc func retrieveContent() {
    62. var query:PFQuery = PFQuery(className: "News")
    63. query.findObjectsInBackground { (objects:[AnyObject]!, error:Error!) -> Void in
    64. self.content = [String]()
    65. for content in objects {
    66. self.user.append(content["content"] as! String)
    67. }
    68. self.tableView.reloadData()
    69. }
    70. }
    71. @objc func retrieveTime() {
    72. var query:PFQuery = PFQuery(className: "News")
    73. query.findObjectsInBackground { (objects:[AnyObject]!, error:Error!) -> Void in
    74. self.time = [String]()
    75. for time in objects {
    76. self.user.append(time["time"] as! String)
    77. }
    78. self.tableView.reloadData()
    79. }
    80. }
    81. }
    Alles anzeigen
    Fehlermeldung an markierter Stelle: "Thread 1: Fatal error: Index out of range" (Demnach sollte es leere Cells geben, das ist allerdings nicht der Fall)

    Hat jemand eine Ahnung was der Fehler sein könnte? Ich vermute, dass es das Programm nicht gut findet, alle Labels der Cell im indexPath.row zu laden ?(

    Vielen Dank und einen ruhigen Start in die Woche,
    Tom
  • In viewDidLoad rufst Du retrieveUser *vor* retrieveDescription auf.

    Am Ende von retrieveUser aktualisierst Du die Tabelle mit self.tableView.relaodData. Zu diesem Zeitpunkt erwartet die Tabelle also schon eine Anzahl von Zeilen = numberOfRowsInSection. Die retrieveDescription ist aber noch gar nicht aufgerufen worden und hat noch keine Einträge. Daher greift die Zuweisung ins Leere - > Fehler!

    Probiere mal die self.tableView.reloadData aus den retrieve-Blöcken rauszunehmen und nur einmal am Ende von viewDidLoad einzufügen.