custom Cell Erzeugt größer werdende Leerzellen

  • custom Cell Erzeugt größer werdende Leerzellen

    Hallo Leute,

    ich hab eine TableViewCell mit paar Labels drin erstellt und diese einer bestehenden Tabelle hinzugefügt, indem ich anstelle jeder Zelle von der Tabelle die CustomTable als rückgabewert gesetzt habe:

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    2. return customCell;
    3. }


    Nach jedem weiteren Datensatz vergrößert sich die (ich nehme das mal an) zweite Zelle und die CustomCell wird nur einmal angezeigt, siehe Anhang.

    Wenn ich beispielsweise 3 Datensätze habe, wird in der Ersten zelle das CustomCell angezeigt und die zweite Zelle ist so groß wie zwei Zellen zusammen.
    Lösche ich die erste Zelle, so verkleinert sich die zweite Zelle um eine Zellenhöhe und es ist nichts von den Daten zu sehen. Wenn ich allerdings die Tabelle dann hoch und runter schiebe/ziehe, erscheint der vorher nicht sichtbare Datensatz.

    Was kann das sein? Wie kann ich das umgehen?


    Danke,
    brush51
  • so wie bei der "Standard" Zelle ?

    Quellcode

    1. static NSString *CellIdentifier = @"Cell";
    2. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    3. if (cell == nil) {
    4. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    5. }
    6. [self configureCell:cell atIndexPath:indexPath];
    7. return cell;
  • Äh - ja.

    OK: Was Du erreichen willst, löst man üblicherweise entweder so, dass Du im IB eine UITableViewCell mit dem ganzen Kladderadatsch erzeugst oder, dass Du eine eigene Cell-Klasse von UITableViewCell ableitest, die Deine ganzen Label usw. enthält. Ich bevorzuge die letzte Variante. Dann verwendest Du für das Initialisieren Deine Cell-Klasse.
  • fwtag schrieb:

    Thallius schrieb:

    Logisch. Und am besten auch gleich noch den reuse wieder einbauen.

    ? Der ist doch drin ...



    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    2. return customCell;
    3. }


    Wo ist da denn der reuse drin ? Da ist mal so gar nichts drin

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Dein Problem wird gelöst, wenn Du immer andere Identifier nimmst:

    Quellcode

    1. NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%i%i", [indexPath row], [indexPath section]];

    Sonst bekommst Du nämlich immer die gleiche Zelle ...

    Dein ursprüngliches Problem liegt vermutlich nicht an dieser Stelle, sondern in der Rückgabe der Höhe der Zelle (tableView:heightForRowInSectioN:)
  • fwtag schrieb:

    Dein Problem wird gelöst, wenn Du immer andere Identifier nimmst:

    Quellcode

    1. NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%i%i", [indexPath row], [indexPath section]];

    Sonst bekommst Du nämlich immer die gleiche Zelle ...


    Jetzt versteh ich gar nichts mehr. Wenn Du jeder Celle einen anderen Identifier gibst, dann kannst du dir das reuse auch sparen. Das trifft dann nämlich nie zu.
    Natürlich sollten alle Cellen, die mit der gleichen Methode "gefüllt" werden können auch den gleichen Identifier haben.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ich hab die Zellenhöhe auf 65 px gesetzt im IB, sowohl für die CustomCell, als auch die Zelle die standardmäßig in der TableView ist.

    Mir ist aber jetzt aufgefallen, das anscheinend meine CustomCell "drunter" liegt, keine Ahnung warum.
    Aber wenn ich "löschen" will, erscheint ein label von meiner CustomCell, siehe Anhang.
  • Thallius schrieb:

    Natürlich sollten alle Cellen, die mit der gleichen Methode "gefüllt" werden können auch den gleichen Identifier haben.

    Ja, das ist schon richtig. Ich sollte vielleicht darauf hinweisen, dass ich TableViews überwiegend für Settings mit eigentlich immer "unterschiedlichartigen" Inhalten einsetze. Aber Du hast bei meiner Methode trotzdem eine deutliche Performancesteigerung, als wenn Du gar kein reuse verwendest. Laut Doku geht es eher um das alloc - und das hast Du, wenn Du mit indexPath als add-on arbeitest, nur einmal je indexPath-section-row-Kombi.

    brush51 schrieb:

    Ich hab die Zellenhöhe auf 65 px gesetzt im IB, sowohl für die CustomCell, als auch die Zelle die standardmäßig in der TableView ist.

    Jetzt hast Du ja auch die richtigen Höhen, oder?

    brush51 schrieb:

    Aber wenn ich "löschen" will, erscheint ein label von meiner CustomCell, siehe Anhang.

    Hier steht was Schönes dazu - schon gesehen ...?
    An important aspect of this drawRect: implementation is the if statement that checks whether the cell’s table view is in editing mode. The view draws the content of its cell only if the cell is not in editing mode. If you wished, you could add an else clause to this statement that draws the cell when it is in editing mode; because the cell has a reduced content area in editing mode, you might have to move fields around, shrink font sizes, or even omit less-important fields. However, drawing in editing mode is not encouraged because, as you might recall, custom drawing while cells animate into and out of editing mode severely affects performance.
  • Ich hab gestern nichts mehr gemacht. Eben gerade hab ich die TableViewCell neu erstellt und nochmal verbunden im IB

    und in der tableView:cellForRowAtIndexPath hab ich folgendes:

    Quellcode

    1. static NSString *CellIdentifier = @"Cell";
    2. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    3. if (cell == nil) {
    4. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    5. }
    6. [self configureCell:cell atIndexPath:indexPath];
    7. return customCell;
    Alles anzeigen


    Eigentlich nichts anderes, als was ich gestern Abend auch hatte, aber merkwürdiger weise funktioniert es jetzt.
    Also mein CustomCell wird angezeigt.
    Jedoch Weiterhin das Problem, wenn ich mehrere Datensätze habe, das die Zweite Zelle immer größer wird und darin wird trotzdem nichts angezeigt.

    Was mach ich denn hier falsch?
  • brush51 schrieb:

    Was mach ich denn hier falsch?


    Du hast einfach das ganze Prinzip einer Tableview und anscheinend auch vom Speichermanament des iOs noch nicht verstanden. Mach erstmal ein paar Tutorials, ließ Dich ein und fang an zu verstehen was Du da eigentlich machst.

    Ist nicht böse gemeint, aber du hast einfach grundlegende Lücken

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Dann weise doch bitte direkt auf meine Lücken hin. Ich habe mich schon durch einige Tutorials durchgearbeitet.
    Fürs erste hab ich genug von den Tutorials, da die meisten sowieso Lückenhaft sind und nicht genau erklärt wird was passiert
    und was wichtig ist, was diese art der Umsetzung für Vor und Nachteile hat, geschweige denn Vergleiche zu anderen möglichen Lösungen gemacht wird.

    Daher möchte ich meine Ansätze so lösen, das ich diese auch selber verstehe. Und wenn ich hier im Forum Denkansätze und Verbesserungsvorschläge bekomme,
    ist das besser als noch einmal die Tutorials zu durchkauen, da die meisten hier im Forum noch erklären warum etwas so ist usw., wofür ich sehr Dankbar bin.

    Und das Forum benutze ich immer als Letzte Anlaufstelle. Wenn ich an meinen Versuchen scheitere und nicht weiterkomme, erstelle ich ein Thema.
    Vorher google ich intensiv und schaue mir andere Beispiele an, versuche diese zu Verstehen und nachzuvollziehen und selbstverständlich die Apple Dokumentation,
    welche ich nicht auf anhieb verstehe.
  • Ehrlich gesagt glaube ich nicht, daß Du Dir mal den SampleCode für TableViews mit Custom-Cellen aus den Apple-Docs angesehen hast. Aber egal.

    Jede Celle muss ein eigenes Object sein. Also must du auch für jeden Aufruf von cellForRowAtIndexPath() eine neue Celle allozieren. Weiterhin bekommen alle Cellen, die mit der gleichen Methode DrawRect() gefüllt werden den gleichen Identifier, damit sie reused werden können. Das iOs fordert nämlich immer nur soviele Cellen an, wie es gleichzeitig auf dem Display darstellen kann. Wird dann gescrollt wird die rausgescrollte Celle nicht freigegeben und eine neue alloziert, sonder es wird einfach nur der neue Inhalt in die bereits vorhandene Celle geschrieben.

    So und mit den Infos schau Dir jetzt mal Deinen Code an und versuche zu verstehen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)