UITableView - Falsche Darstellung

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

  • UITableView - Falsche Darstellung

    Hallo zusammen,

    ich habe ein Problem mit einer UITableView. Ich habe angefangen ein Projekt von mir im Storyboard auf SizeClasses umzustellen.
    Dabei ergibt sich aber jetzt folgendes Problem: Ich fülle Objekte einer UITableViewCell in cellForRowAtIndexPath anhand von Tags mit Daten:

    Quellcode

    1. UIImageView *imageView = (UIImageView *)[cell viewWithTag:100];
    2. UIImage *image = [currCustomer profileImage];

    Klappt auch. Wenn die App allerdings startet, ist die Zelle leer. Bewege ich nun den Inhalt der TableView mit meinem Finger nach oben unter meine NavigationBar und lasse los, scrollt sie ja automatisch wieder runter, samt Inhalt.
    Ist das ein Xcode-Bug?

    Vllt. hat jemand ein ähnliches Phänomen und bring Licht in mein Dunkel :D
    Loves Metal :evil:
  • Hallo,

    dein Auszug aus dem Quellcode ist leider nicht aussage kräftig genug. Setzt du auch das Image, und machst danach noch ein

    Quellcode

    1. [cell layoutIfNeeded]
    .
    Das Verhalten der TableView hört sich Bouncing an. Bzw. setzt du auch die Anzahl der Zellen.

    Quellcode

    1. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    2. return 0;
    3. }

    erzeugt eine Tabelle mit einer Section und null Zellen.

    Das gleiche gilt für

    Quellcode

    1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    2. {
    3. return 0;
    4. }


    erzeugt eine Tabelle mit 0 Sectionen == leere Tabelle.

    Dies passt auf das beschriebene Verhalten.
  • Telecaster95 schrieb:

    Ich fülle Objekte einer UITableViewCell in cellForRowAtIndexPath anhand von Tags mit Daten

    Ich schätze mal, da liegt das Problem.
    Apple scheint auf Cell Prototypes umgestiegen zu sein.
    Seit iOS 6 gibt es ja unter Anderem das wunderfeine [UITableView -dequeueReusableCellWithIdentifier:forIndexPath:], welches Prüfen auf nil und manuelles Erstellen der Zellen endlich obsolet macht – wenn man denn Cell Prototypes hat…

    Eventuell wird Deine Implementierung einfach ignoriert, weil Du nicht auf die Cell Prototypes des UITableViewControllers im Storyboard zugreifst.

    Wie dem auch sei, ich sehe da einen Widerspruch oder mindestens eine Unklarheit:

    Telecaster95 schrieb:

    Wenn die App allerdings startet, ist die Zelle leer.

    Telecaster95 schrieb:

    scrollt sie ja automatisch wieder runter, samt Inhalt.

    Hat die Zelle denn jetzt einen Inhalt oder nicht?
    Wenn nicht, welcher Inhalt scrollt denn da zurück?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Hi,

    Quellcode

    1. [cell layoutIfNeeded]

    gerade ausprobiert, ändert nichts. Ja, Anzahl der Zellen wird gesetzt.

    Quellcode

    1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    2. {

    returned bei mir 1, da ich eine Section drin habe.
    Das Kuriose: Der selbe Quelltext funktioniert fehlerfrei wie er soll unter dem identischen Projekt ohne SizeClasses..
    Loves Metal :evil:
  • Ich benutze eine PrototypeCell ?(
    Wenn die App startet, zeigt sie mir eine Zelle an (ist auch richtig so) aber nicht mit dem gewünschten Inhalt sondern mit den Plathaltern aus dem Storyboard.
    Mache ich nun die Scrollbewegung so, dass die Zelle unter meiner Navigationbar verschwindet und zurückkommt, ist die Zelle so wie gewünscht.

    So erzeuge ich meine Zelle:

    Quellcode

    1. static NSString *CellIdentifier = @"Cell";
    2. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    Loves Metal :evil:
  • Marco Feltmann schrieb:

    Seit iOS 6 gibt es ja unter Anderem das wunderfeine [UITableView -dequeueReusableCellWithIdentifier:forIndexPath:], welches Prüfen auf nil und manuelles Erstellen der Zellen endlich obsolet macht – wenn man denn Cell Prototypes hat…


    Soweit habe ich nicht gedacht. Ok, ich habe schon immer per dequeue Zellen abgerufen (warum sollte ich mich auch um die Speicherverwaltung der blöden Zellen kümmern, man muss ja schon an anderen Stellen darum kümmern).
  • Telecaster95 schrieb:

    Das Kuriose: Der selbe Quelltext funktioniert fehlerfrei wie er soll unter dem identischen Projekt ohne SizeClasses..

    Also ich habe einige Projekte mit TableView und SizeClasses, in denen alles so läuft wie ich das gewöhnt bin.

    Für mich klingt das so, als würdest Du die Cell erst zurückgeben und dann überarbeiten.
    Ist natürlich eher unwahrscheinlich…

    Du solltest auf jeden Fall mal den Debugger anwerfen und schauen, ob die zurückgegebene Zelle schon die Daten beinhaltet, die Du gern hättest.

    Und prüfe auch nach, ob die Views in allen Size Classes (wAny:hAny) verfügbar sind.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Ich habe eine separate Klasse mit einem Array welches am Anfang ein Objekt enthält was nach dem Starten der App in der TableView angezeigt werden soll.
    Nach und nach wird dieses Array mit Objekten gefüllt. Da mache ich dann ein reloadData.
    Ich denke auch nicht dass es an meinem Code liegt, schließlich funktioniert dieser ohne SizeClasses
    Loves Metal :evil:
  • Telecaster95 schrieb:

    Ich denke auch nicht dass es an meinem Code liegt, schließlich funktioniert dieser ohne SizeClasses

    Durch SizeClasses ändern sich grundlegende UI Konzepte, es kann also durchaus an Deinem Code liegen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Hier der Quelltext:

    Quellcode

    1. (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    2. static NSString *CellIdentifier = @"Cell";
    3. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    4. Customer *currCustomer;
    5. NSString *dateString;
    6. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    7. [dateFormatter setDateFormat:@"HH:mm:ss"];
    8. if (cell == nil)
    9. cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    10. currCustomer = [customers objectAtIndex:indexPath.row];
    11. UIImageView *imageView = (UIImageView *)[cell viewWithTag:100];
    12. UIImage *image = [currCustomer profileImage];
    13. const CGFloat cornerRadius = imageView.frame.size.width / 2;
    14. [imageView.layer setCornerRadius :cornerRadius];
    15. [imageView.layer setMasksToBounds:YES];
    16. [imageView.layer setBorderWidth :2];
    17. [imageView.layer setBorderColor :[[UIColor lightGrayColor]CGColor]];
    18. [imageView setImage:image];
    19. dateString = [dateFormatter stringFromDate:[currCustomer lastLogin]];
    20. UILabel *lbl_customerName = (UILabel *)[cell viewWithTag:101];
    21. UILabel *lbl_cardNo = (UILabel *)[cell viewWithTag:102];
    22. [lbl_customerName setText:[NSString stringWithFormat:@"%@ %@", [currCustomer firstName], [currCustomer lastName]]];
    23. [lbl_cardNo setText:[NSString stringWithFormat:@"%@ (%@)", [currCustomer cardNo], dateString]];
    24. return cell;
    25. }
    Alles anzeigen
    Loves Metal :evil:
  • Tja es scheint gelöst.
    Ich habe ein ganz neues Projekt angelegt, in mühevoller Kleinstarbeit die GUI mit SizeClasses neu erstellt, den Quelltext nicht kopiert sondern abgeschrieben und jetzt klappt es.
    Identischer Code, nur neues Storyboard. Hmm.. Naja egal, muss ich den Rest halt auch neu machen..

    Danke an alle die mir geholfen haben!

    - Der Tele ^^
    Loves Metal :evil:
  • Wenn ich jetzt mal Static Analyzer spiele…

    Quellcode

    1. if (cell == nil)
    2. cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    3. UIImageView *imageView = (UIImageView *)[cell viewWithTag:100];

    Behaupte ich, dass im Falle einer nicht gefundenen Cell eine Standardzelle erstellt wird.
    Da die keine Views mit keinen Tags haben dürfte, sind dementsprechend alle Views, die Du über ihren Tag abfragst == nil.

    Deshalb der angesprochene [UITableView -dequeueReusableCellWithIdentifier:forIndexPath:]. Der sorgt dafür, dass Du nix selbst anleiern musst sondern alles aus dem designten Cell Prototype übernommen wird. Der reuseIdentifier muss natürlich mit dem der Cell Prototype übereinstimmen.

    Warum das später funktioniert ist allerdings etwas, das ich partout nicht verstehen kann…
    Ich sehe jedenfalls nicht, wo Du im Falle von nil-Views selbst welche erstellst.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P