2017-06-16 4 views
1

Ich versuche, einige Daten aus CloudKit zu laden, um eine Tabellenansicht mit benutzerdefinierten Zellen zu füllen, und ich habe Schwierigkeiten, die Daten angezeigt zu bekommen.UITableViewCells wird nicht laden Index liegt außerhalb des Bereichs

Wenn ich die Anzahl der Zeilen als die Anzahl der CKRecord-Array definieren, wird die Tabellenansicht angezeigt, aber nichts in sie geladen. Sie sind nur richtig verteilt, damit die Bilder dort sind. Wenn ich Haltepunkte bei let record = matches[indexPath.row] einstelle, wird es auch nicht ausgelöst.

Wenn ich jedoch die return matches.count in eine tatsächliche Zahl ändern, stürzt das Projekt bei let record = matches[indexPath.row] mit dem Fehler ab, dass der Index außerhalb des Bereichs liegt. Ich möchte die Anzahl der Zeilen als die Anzahl für das Datensatzarray beibehalten, aber das ist die einzige Änderung, die tatsächlich die Überschreibungsfunktion ausführt, die die Tableview-Zelle aufruft.

override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return matches.count 
    } 


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCell(withIdentifier: "Card", for: indexPath) as! MatchTableViewCell 

     let record = matches[indexPath.row] 

     if let img = record.value(forKey: "Picture") as? CKAsset { 
     cell.profileimg.image = UIImage(contentsOfFile: img.fileURL.path) 

     } 

     return cell 
    } 

Jede Beratung

Update- hier geschätzt ist, wo ich das Modell laden

func loadModel() { 

     let totalMatch = (defaults.object(forKey: "passedmatch") as! [String]) 

     let predicateMatch = NSPredicate(format: "not (UserID IN %@)", totalMatch) 


     ProfilesbyLocation = defaults.object(forKey: "Location") as! String 

     let query = CKQuery(recordType: ProfilesbyLocation , predicate: predicateMatch) 

     publicData.perform(query, inZoneWith: nil,completionHandler: ({results, error in 

      print("loading") 

      if (error != nil) { 
       let nsError = error! as NSError 
       print(nsError.localizedDescription) 
       print ("error") 

      } else { 
       if results!.count > 0 { 
         DispatchQueue.main.async() { 

         self.tableView.reloadData() 
         self.refresh.endRefreshing() 

         print("refreshed") 
         } 

       } 
      } 
      } 
      ) 
     )} 
+0

Und es gibt keine Möglichkeit, dass "Übereinstimmungen" irgendwie zwischen den Aufrufen von "numberOfRowsInSection" und "cellForRowAt" geändert wird? – NRitH

+0

Das Array lädt asviewdload asynchron, so dass ich nicht sicher bin, wie es danach –

+0

* A * synchron ändern könnte? Also * könnte * durch einen anderen Thread geändert werden, während der Haupt-Thread versucht, von ihm zu lesen? – NRitH

Antwort

0

Es klingt wie Sie nicht

tableview.reloadData() 

nach dem asynchronen Daten aufrufen kommt in. Lassen Sie numberOfRowsInSection wie es ist und stellen Sie sicher, wenn Sie Ihre Netzwerkanforderung zurückkommt werden neu geladen. Das sollte es tun.

+0

Ich fügte hinzu, und ich bekomme immer noch den gleichen Fehler. Ich habe es sowohl in meiner Ladedatenfunktion als auch in der Übersteuerungsfunktion versucht. –

0

Wenn Sie Ihre Daten vom Hintergrundthread (oder der Warteschlange) erhalten haben, stellen Sie bitte sicher, dass Sie Ihre UI-Elemente unter dem Hauptthread (oder der Warteschlange) aktualisieren. Versuchen Sie dies:

DispatchQueue.main.async { 
      tableView.reloadData() 
     } 
0

Dies löste mein Problem.

Trennen Sie zunächst die Delegate/DataSource der TableView vom Interface Builder refer this image. Wenn Sie Ihre Daten vorbereitet haben, die entspricht Array dann fügen Sie dies hinzu.

`DispatchQueue.main.async { 
    tableView.dataSource = self 
    tableView.delegate = self 
    tableView.reloadData 
}` 

Hoffe, das hilft.

0

Es sieht so aus, als ob Ihre matches nicht korrekt ist. Bevor Sie func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) anrufen, sollten Sie Ihre matches überprüfen.

Wenn Sie sich noch nicht sicher sind. Sie können Ihre matches mit Zeichenfolgenliteralen initiieren und versuchen.

Verwandte Themen