• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

TableView Schleife

  • Ersteller Mini-mc
  • Erstellt am

Mini-mc

Gast
Hallo,

Ich habe folgendes Problem. Wenn ich den Code wie hier beschrieben anwende, wird mir immer die Qualifikation des Letzten auslese Vorgang angezeigt. Das ist so ja auch vollkommen logisch. Ich will jetzt, dass dabei immer die Qualifikation der jeweiligen Person in der Cell dazu passend dargestellt wird. Ich bin mir nicht sicher, ob ich mich verständlich ausgedrückt habe.
Code:
  if ([qualiAbk count] !=0) {
            for (int i = 0; i<[qualiAbk count]; i++) {
             
                NSString *getAbk = [NSString stringWithFormat:@"SELECT abk FROM table_quali WHERE id_q == %@", [qualiAbk objectAtIndex:i]];
                const char *cGetAbk = [getAbk UTF8String];
                [dbConnect openDb];
                qualiAbk2 = [dbConnect getItems2:cGetAbk];
                NSLog(@"Qualifikationen Gefunden:%@", [qualiAbk2 objectAtIndex:0] );
                [dbConnect closeDb];
          

                 cell.detailTextLabel.text = [NSString stringWithFormat:@"Qualifikation: %@", [qualiAbk2 objectAtIndex:0]];
            }
        }

Vielen Dank für die Hilfe im vor raus!
 
Zuletzt bearbeitet von einem Moderator:

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.560
Zunächst mal ist die if-Anweisung überflüssig. Sie schadet allerdings auch nicht.

Die Grundidee, einen TableView per Schleife mit Daten zu versorgen, ist grundsätzlich falsch. Der Steuerungsfluss muss genau andersherum sein: Nicht das Programm füllt von sich aus die Zellen der Tabelle mit Daten, sondern der TableView fragt das Programm jeweils nach den Daten, die zum Zeichnen einer ganz bestimmten Zelle nötig sind. Auf diese Weise brauchen nur Daten für den gerade sichtbaren Teil der Tabelle geliefert zu werden.

Angenommen die Tabelle table_quali hätte 100 Zeilen, dann schreibt Deine Schleife 100 mal verschiedene Daten in ein und dieselbe Zelle und nur die allerletzte Änderung hat irgendeine Wirkung. Alle 99 Operationen davor sind überflüssig.

Korrekt wäre, dass Dein Programm in der Delegate-Methode -tableView:cellForRowAtIndexPath: des dataSource-Objekts eine Zelle für die angefragte Indexposition erzeugt und in diese eine Zelle den passenden Wert einsetzt. Für welche Indexpositionen die grafische Oberfläche gerade Daten benötigt, muss Dich nicht kümmern. Das "weiß" die Oberfläche am besten, Du musst nur die passenden Daten für die angefragte Position liefern. Eine Schleife wird also nicht gebraucht.

Ein Effizienzproblem ist dann noch, dass die arme Datenbank für jede Zeile geöffnet, abgefragt und geschlossen werden muss. Da sollte man sich bessere Lösungen überlegen, z.B. je nach Größe der Datenbank vorher alle Zeilen in einem Array zwischenspeichern und dann nur auf das Array zugreifen. Welche Lösung angemessen ist, hängt aber von den konkreten Details ab.
 
  • Like
Reaktionen: Mini-mc

Mini-mc

Gast
Vielen Dank!
Hat mir sehr weiter geholfen. Jetzt Funktioniert alles.
Grüße!