2017-04-10 5 views
0

Ich versuche, meine UITableView mit mehr Zeilen anhängen, sobald der Benutzer den unteren Rand von UITableView erreicht. Allerdings, wenn ich nach unten zu scrollen versuchen, mehr Daten nenne ich eine Fehlermeldung erhalten, die sagt:Wie fügt man beim Paginieren Zeilen zu UITableView hinzu?

fatal error: Index out of range 

Hier ist mein Code:

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    let contentOffset = scrollView.contentOffset.y 
    let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height; 
    if !isLoadingMore && (maximumOffset - contentOffset <= threshold) { 
     self.isLoadingMore = true 

     DispatchQueue.main.async() { 
      self.fetchMovieData() 
      self.isLoadingMore = false 
     } 
    } 
} 

ich auch halten werde verfolgen, wie viele Zeilen sind wobei zu meinem Tisch Ansicht hinzugefügt Hinzufügen zu meinen rowNumber zählen als weitere Daten genannt:

var rowNumber: Int = 0 

Hier ist, wo ich meine Anfrage mache:

func fetchMovieData(_ url: String,_ params: Dictionary<String, String>) { 
     if more { 
      Alamofire.request(url, parameters: params) 
       .responseJSON { 
        response in 
        switch response.result { 
        case .success(let value): 
         self.currentPageNumber += 1 
         let json = JSON(value) 
         self.movieObject = [MovieModel.init(data: json)] 
         self.rowNumber += self.movieObject[0].movieList[0].movieDict.count 
         self.tableView.reloadData() 
        case .failure(let error): 
         print(error) 
       } 
      } 
     } 
    } 

Also ich denke, meine Frage ist, sollte ich anrufen werden:

self.tableView.reloadData() 

Um mehr Daten meine Tabellenansicht anhängen oder gibt es etwas, was ich vermisst habe?

+0

Nun, das sollte es tun. Es scheint, dass Ihr Problem hier liegt: 'self.movieObject = ...' - Sie erstellen ein neues Modell und ersetzen das alte. Sie sollten Ihr Modellobjekt konstruieren, damit Sie neue Daten anhängen können. – Losiowaty

Antwort

2

Das Problem besteht darin, dass Sie Ihr Array nicht mit mehr Daten anhängen, sondern die alten Daten durch die neue ersetzen, die zum Beispiel die Array-Zahl 10 beibehalten, aber die Zeilenanzahl erhöht, also den Index aus Bereichsfehler wird auftreten, weil Sie beispielsweise versuchen, auf Array [11] zuzugreifen, aber Sie haben nur 10 Elemente in diesem Array.

diesen Versuch zu lösen Ihre Funktion mit dieser zu ersetzen:

func fetchMovieData(_ url: String,_ params: Dictionary<String, String>) { 
    if more { 
     Alamofire.request(url, parameters: params) 
      .responseJSON { 
       response in 
       switch response.result { 
       case .success(let value): 
        self.currentPageNumber += 1 
        let json = JSON(value) 
        let newArray = [MovieModel.init(data: json)] 
        for i in newArray { 
        self.movieObject.append(i) 
        } 
        self.movieObject = [MovieModel.init(data: json)] 
        self.rowNumber += self.movieObject[0].movieList[0].movieDict.count 
        self.tableView.reloadData() 
       case .failure(let error): 
        print(error) 
      } 
     } 
    } 
} 
+0

Genau richtig. Ich musste die Logik etwas anpassen, aber das war die richtige Antwort. Vielen Dank! –

Verwandte Themen