UITableView über 2 Quellen "füttern"

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

  • UITableView über 2 Quellen "füttern"

    Hallo Community!

    System:
    Ich entwickle gerade eine App mit Xcode 11.3.1 und Swift 5.0.

    Aufgabenstellung:
    Ich habe ein Array welches Inhalte enthält. Aktuell zum testen sind es Strings - später werden es Objekte sein.
    In einem zweiten Array ( aktuell ebenfalls Strings -> später Objekte )
    Im dazugehörigen ViewController nutze ich die üblichen Verdächtigen als extension: numberOfRowsInSection & cellForRowAt indexPath.
    Bei ersterem lasse ich mit return die länge des ersten Arrays ausgeben - welche mir die Anzahl der Cell's gibt.
    Im zweiten prüfe ich ob im zweiten Array etwas drin ist - falls nicht gib mir nur den Inhalt des ersten Arrays in Cell's aus.
    Falls doch etwas drin ist erhöhe eine variable um 1 und nimm diese Variable als index des Arrays um die Inhalte als Cell zu bauen und diese Cell immer als 5. anzuzeigen.
    Soweit klappt es auch schon.

    Mein Problem:
    Es fehlt immer der erste Datensatz ( die erste Cell ) des ersten Arrays und der erste Tip ( aus dem Array für die Tips )

    Screenshot:
    Ich hänge noch einen Screenshot vom Simulator an der das Problem verdeutlicht.
    Wenn ich jetzt mit der Maus ein paar mal rauf und runter swipe werden die Tips bunt gemischt und neu platziert und auch Tip 1 kommt irgendwann mal dran ...
    Nur den ersten eigentlichen Inhalt sehe ich leider nicht ...
    [Blockierte Grafik: https://www.jux-dollerei.com/forum/screen_1.png]

    Code:

    Quellcode

    1. class ViewController: UIViewController{
    2. @IBOutlet weak var tableView: UITableView!
    3. let array_inhalt = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"]
    4. var array_tips = ["Tip 1", "Tip 2", "Tip 3", "Tip 4", "Tip 5"]
    5. var tipCount = 0
    6. override func viewDidLoad(){
    7. super.viewDidLoad()
    8. tableView.dataSource = self
    9. }
    10. }
    11. extension ViewController: UITableViewDataSource {
    12. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    13. return array_inhalt.count
    14. }
    15. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    16. let cell = tableView.dequeueReusableCell(withIdentifier: "tableViewCell", for: indexPath) as! tableViewCell
    17. // wenn array_tips nicht leer ist
    18. if self.array_tips.count != 0 {
    19. if (indexPath.row % 5 == 0) { // jede fünfte zeile soll ein tip sein
    20. if self.tipCount < self.array_tips.count{
    21. self.tipCount += 1
    22. }
    23. if self.tipCount == self.array_tips.count{
    24. self.tipCount = 0
    25. }
    26. // wenn es ein tip ist
    27. cell.textLabel?.text = "\(self.array_tips[self.tipCount])"
    28. } else {
    29. // wenn es normaler inhalt ist
    30. cell.textLabel?.text = "Inhalt \(array_inhalt[indexPath.row - (indexPath.row / 5)])"
    31. }
    32. } else {
    33. // wenn das array_tips leer ist
    34. cell.textLabel?.text = "\(array_inhalt[indexPath.row])"
    35. }
    36. // ausgabe
    37. return cell
    38. }
    39. }
    Alles anzeigen
    Vielen Dank an alle die sich die Mühe machen ein Lösung zu posten / finden.

    VG und bleibt alle gesund, Steffe :thumbup:
  • Hi Steffe,

    Ich glaube, dass Du an ein paar Stellen stolperst - bzw. die Gefahr besteht:
    • Wichtigster Punkt: Du erhöhst mit den Tipps die Anzahl der darzustellenden Zeilen. Dann ist es falsch, für die Delegate-Methode "numbersOfRows..." nur die Elementanzahl des Inhalts-Arrays zurückzugeben: Da wirst Du etwas rechnen müssen, um die Anzahl der Tippzeilen aufzuschlagen
    • Der erste Tipp erschein nie, weil Du den tipCount schon von 0 auf 1 erhöhst, bevor Du dessen Array-Element ansprichst
    • Der erste Inhalt kommt nicht, weil die indexPath.row = 0 ja von einem Tipp belegt wird. Hier musst Du beim Zugriff auf die Array-Elemente etwas nachbessern.
    • Momentan noch nicht relevant, aber potentielle Fussangel: Die Zellen werden gecacht. Du solltest bei unterschiedlichen Zell-Typen unbedingt auch mit unterschiedlichen Identifiern arbeiten. Solange Du nur den Label-Text setzt, ist das noch kein Problem.
    Ich würde einfach einmal mit Stift und Papier den Code für ein paar Zeilen nachvollziehen, dann wird es klarer... :)

    HTH, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo @MyMattes,

    vielen Dank für deine Antwort.

    Ich hatte schon vorher mal damit gespielt array_inhalt.count + array_tips.count zusammen zu rechnen in eine Variable und diese dann numberOfRowsinSection zu nutzen - dann hätte ich die korrekte Anzahl - richtig?

    Das mit dem tipCount = 0 macht jetzt wo du es schreibst total Sinn. Vielleicht überprüfe ich erstmal ob was im array_tips vorhanden ist und falls ja setze ich den 1 - müsste klappen oder!? Damit müsste man dann ja auch das Problem lösen können das der erste Inhalt nicht kommt?

    Dann beschäftige ich mal damit, wie man eine zweite Prototypenzeile installiert und werde dann gerne wieder Bericht erstatten.

    Zunächst vielen Dank! Ich denke HTH heißt hope that helps? In diesem Fall soweit erstmal - JA! Danke! :)

    VG Steffe
  • Steffe schrieb:

    Ich hatte schon vorher mal damit gespielt array_inhalt.count + array_tips.count zusammen zu rechnen in eine Variable und diese dann numberOfRowsinSection zu nutzen - dann hätte ich die korrekte Anzahl - richtig?
    Nee :) Du lässt die Tipps ja über die Elementanzahl hinaus rotieren: Damit hast Du sowas wie <Anzahl Inhalt> + ceil(<Anzahl Inhalt> / 5) als Zeilenanzahl.

    Ich finde es bei dieser Delegate-Methode leichter, mich vom IndexPath zu nähern und dann zu überlegen, was ich in der x. Zeile der y. Sektion stehen haben möchte. Kommt - bei sauberer / vollständiger Betrachtung - auf das gleich heraus, vermeidet bei mir aber Knoten im Gehirn. Also erste Zeile Tipp(0), dann fünf Zeilen Inhalt (0-4), dann Tipp(1)… das Ganze schreit eigentlich nach einer Tabelle zweier Wertereihen, für die man sich eine Abbildungsfunktion überlegt (ja, auf Papier): „Wie kann ich aus dem ZeilenIndex den anzuzeigenden Text ermitteln“ … und schwups ist Dein Algorithmus fertig.

    Old school, aber so hab‘ ich‘ gelernt.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.