• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> 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

Breuhahn
Registriert
28.05.04
Beiträge
8.597
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!