Ich kapiere es nicht ...
Ich habe eine Tabelle, die mehrere Spalten und Zeilen darstellen kann.
Der Ordnung halber sei gesagt, dass links noch ein Auswahlhäkchen erscheint und rechts optional noch ein UIButton stehen kann.
Meine Testdaten liefern für die ersten beiden Tabellenzellen je 3 Werte (2 Label für die obere Zeile, 1 Label für die 2. Zeile), der Rest hat nur 2 Label für die erste Zeile.
Die Erstellung läuft super, ich kann scrollen und alles sieht klasse aus.
Das Problem tritt auf, wenn ich
1. Das Gerät auf die Seite drehe
2. so weite nach oben scrolle, dass die ersten beiden Zellen weg sind
3. dann wieder auf Portraitmodus gehe
denn dann sind die Label der 2. Zeile weg.
Die UITableViewCell wird recycelt und ich suche dann alle Label aus der Zelle mit [cell.contentView viewWithTag:tag];.
Nach ewigem Suchen habe ich dann endlich festgestellt, dass nach dem Drehen halt manchmal diese Label nicht mehr da sind.
Ich habe jetzt den Workaraound, dass in diesen Fällen die Label neu erzeugt werden, aber richtig gefallen kann mir das nicht.
Nicht nur, dass ich bei langen Listen Speicherprobleme befürchte, ich kapiere auch nicht, warum die Label weg sind.
Kann es damit zusammen hängen, dass die anderen (dann sichtbaren Zellen) nur 2 Label darstellen?
Damit es nicht zu falscher Darstellung kommt, setze ich zunächst beim Füllen der Label alle Label der Zelle auf hidden und setze diesen Status nur zurück, wenn ich einen darzustellenden Wert finde.
Das sieht im NSLog auch alles prima aus, bis ich dann wie beschrieben, das iPhone drehe.
Kann mir das einer erklären?
Hier noch ein bisschen Code zum besseren Verständnis:
Alles anzeigen
Warum der Code jetzt so bescheiden formatiert ist, weiß ich auch nicht. Er steht zwischen den Code-Tags und bei der Vorschau sah er noch gut aus.
Ich glaube, ich sollte für heute Feierabend machen
Ich habe eine Tabelle, die mehrere Spalten und Zeilen darstellen kann.
Der Ordnung halber sei gesagt, dass links noch ein Auswahlhäkchen erscheint und rechts optional noch ein UIButton stehen kann.
Meine Testdaten liefern für die ersten beiden Tabellenzellen je 3 Werte (2 Label für die obere Zeile, 1 Label für die 2. Zeile), der Rest hat nur 2 Label für die erste Zeile.
Die Erstellung läuft super, ich kann scrollen und alles sieht klasse aus.
Das Problem tritt auf, wenn ich
1. Das Gerät auf die Seite drehe
2. so weite nach oben scrolle, dass die ersten beiden Zellen weg sind
3. dann wieder auf Portraitmodus gehe
denn dann sind die Label der 2. Zeile weg.
Die UITableViewCell wird recycelt und ich suche dann alle Label aus der Zelle mit [cell.contentView viewWithTag:tag];.
Nach ewigem Suchen habe ich dann endlich festgestellt, dass nach dem Drehen halt manchmal diese Label nicht mehr da sind.
Ich habe jetzt den Workaraound, dass in diesen Fällen die Label neu erzeugt werden, aber richtig gefallen kann mir das nicht.
Nicht nur, dass ich bei langen Listen Speicherprobleme befürchte, ich kapiere auch nicht, warum die Label weg sind.
Kann es damit zusammen hängen, dass die anderen (dann sichtbaren Zellen) nur 2 Label darstellen?
Damit es nicht zu falscher Darstellung kommt, setze ich zunächst beim Füllen der Label alle Label der Zelle auf hidden und setze diesen Status nur zurück, wenn ich einen darzustellenden Wert finde.
Das sieht im NSLog auch alles prima aus, bis ich dann wie beschrieben, das iPhone drehe.
Kann mir das einer erklären?
Hier noch ein bisschen Code zum besseren Verständnis:
Quellcode
- -(UILabel *)createLabelAusSpalte:(XmlListSpalte *)spalte maxSpalte:(int) maxSpalte {
- float spaltenBreite = [self calcSpaltenBreiteFor:maxSpalte];
- int spalteVon, spalteBis;
- spalteVon = spalte.iSpalte;
- spalteBis = (spalte.iSpan > 1 ? spalteVon + spalte.iSpan - 1 : spalteVon);
- float links = spaltenBreite * (spalteVon - 1);
- float breite = spaltenBreite * (spalteBis - spalteVon + 1);
- if (spalteVon == 1) {
- links = links + POS_LINKS;
- breite = breite - POS_LINKS;
- };
- if (spalteBis == maxSpalte) {
- breite = breite - POS_LINKS;
- }
- CGRect rect = CGRectMake(links, spalte.yPos, breite, spalte.fontSize + 4);
- UILabel *label = [[[UILabel alloc] initWithFrame:rect] autorelease];
- label.tag = [self calcTagForZeile:spalte.iZeile andSpalte:spalte.iSpalte];
- [label setNumberOfLines:1];
- [label setAdjustsFontSizeToFitWidth:YES];
- DLog(@"Neues Label an X=%0.f Y=%0.f W=%0.f H=%0.f Inhalt:%@", label.frame.origin.x, label.frame.origin.y, label.frame.size.width, label.frame.size.height, spalte.sText);
- return label;
- }
- -(void)createObjectsForCell:(UITableViewCell *)cell fromSpalten:(NSArray *)listSpalten inRow:(int)row maxSpalte:(int)maxSpalte {
- for (XmlListSpalte *spalte in listSpalten) {
- if (spalte.hasBild) {
- } else {
- UILabel *label = [self createLabelAusSpalte:spalte maxSpalte:maxSpalte];
- [cell.contentView addSubview:label];
- }
- }
- }
- -(void)fillObjectsForCell:(UITableViewCell *)cell fromSpalten:(NSArray *)listSpalten maxSpalte:(int) maxSpalte {
- for (UIView * view in [cell.contentView subviews]) {
- if ( [view isKindOfClass:[UILabel class]] ) {
- view.hidden = YES;
- }
- }
- for (XmlListSpalte *spalte in listSpalten) {
- if (spalte.hasBild) {
- } else {
- int tag = [self calcTagForZeile:spalte.iZeile andSpalte:spalte.iSpalte];
- UILabel *label = (UILabel *)[cell.contentView viewWithTag:tag];
- if (!label) {
- label = [self createLabelAusSpalte:spalte maxSpalte:maxSpalte];
- [cell.contentView addSubview:label];
- }
- if (label) {
- label.text = spalte.sText;
- label.opaque = NO;
- label.hidden = NO;
- TextAttribute *myAttr = [[[BIS_Common sharedInstance] lastXmlData] getTextAttributForListSpalte:spalte];
- [TextAttribute attributWithAttribute:listAttribut];
- [myAttr mergeTextAttribut:spalte.textAttribut];
- [myAttr formatUILabel:label];
- //DLog(@"Filled Label an X=%0.f Y=%0.f W=%0.f H=%0.f Inhalt:%@", label.frame.origin.x, label.frame.origin.y, label.frame.size.width, label.frame.size.height, spalte.sText);
- }
- }
- }
- }
- // Customize the appearance of table view cells.
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
- int BTN_INFO_SIZE = 20;
- static NSString *EditCellIdentifier = @"listCell";
- XmlData *myXmlData = [[BIS_Common sharedInstance] lastXmlData];
- XmlListZeile * lZeile = [myXmlData getXmlListZeile:[indexPath row]];
- int maxSpalte = myXmlData.xmlListe.maxSpalte;
- NSArray *listObjects = [myXmlData getListItemsForRow:[indexPath row]];
- if ([indexPath row] == 1) {
- for (XmlListSpalte *spalte in listObjects) {
- DLog(@"Listobjekt Zeile %d, Spalte %d, Tag %d = %@", spalte.iZeile, spalte.iSpalte, [self calcTagForZeile:spalte.iZeile andSpalte:spalte.iSpalte], spalte.sText);
- }
- }
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:EditCellIdentifier];
- if (cell == nil) {
- //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:EditCellIdentifier] autorelease];
- cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:EditCellIdentifier] autorelease];
- //DLog(@"Cell created at X=%0.f Y=%0.f W=%0.f H=%0.f", cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height);
- [self createObjectsForCell:cell fromSpalten:listObjects inRow:[indexPath row] maxSpalte:maxSpalte];
- //DLog(@"Cell labeled at X=%0.f Y=%0.f W=%0.f H=%0.f", cell.frame.origin.x, cell.frame.origin.y, cell.frame.size.width, cell.frame.size.height);
- [listAttribut formatUIView:cell];
- UIImageView *imageView = [[UIImageView alloc] initWithImage:unselectedImage];
- imageView.frame = CGRectMake(0.0, 10.0, 23.0, 23.0);
- [listAttribut formatUIView:imageView];
- [cell.contentView addSubview:imageView];
- imageView.hidden = FALSE;
- imageView.tag = kCellImageViewTag;
- [imageView release];
- if (zeigeDetailButton) {
- UIButton *newButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
- newButton.frame = CGRectMake(DISPLAY_BREITE - BTN_INFO_SIZE - 1, 7, BTN_INFO_SIZE, BTN_INFO_SIZE);
- newButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
- newButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
- [newButton setTag:kCellInfoButtonTag];
- newButton.autoresizesSubviews = YES;
- [newButton setAutoresizingMask:UIViewAutoresizingFlexibleLeftMargin];
- [newButton addTarget:self action:@selector(clickedListButton:) forControlEvents:UIControlEventTouchUpInside];
- [listAttribut formatUIView:newButton];
- [cell.contentView addSubview:newButton];
- }
- }
- [self fillObjectsForCell:cell fromSpalten:listObjects maxSpalte:maxSpalte];
- if (zeigeDetailButton) {
- UIButton *infoButton = (UIButton *)[cell.contentView viewWithTag:kCellInfoButtonTag];
- if ([indexPath row] > 0) {
- [infoButton setTitle:[NSString stringWithFormat:@"%d", [indexPath row]] forState:UIControlStateApplication];
- infoButton.hidden = NO;
- } else {
- infoButton.hidden = YES;
- }
- }
- UIImageView *imageView = (UIImageView *)[cell.contentView viewWithTag:kCellImageViewTag];
- imageView.image = ([lZeile bChecked]) ? selectedImage : unselectedImage;
- imageView.hidden = ![lZeile bChecked];
- return cell;
- }
Warum der Code jetzt so bescheiden formatiert ist, weiß ich auch nicht. Er steht zwischen den Code-Tags und bei der Vorschau sah er noch gut aus.
Ich glaube, ich sollte für heute Feierabend machen