2012-10-03 2 views
5

I benutzerdefinierte Zelle UILabel, UIImageView, unter Verwendung von konstantem Tag für UILabel, UIImageView mit dynamischem Tag enthält am Erstellen die Tabelle 11 Zellen haben, die ersten richtig geladen 7-Zellen, die 8, 9, 10, 11 Zelle Bildansicht ändern, wenn ich die 1, 2, 3, 4, Zelle jeweils in der Tabelle ändern, auch die Tags sind in den Zellen gleich, ich verwende die Bilder zum Kontrollkästchen in der Tabelle, UITapGestureRecognizer verwendet, um zu ändern Imageview in der Tabelle,warum Tag in tableview zu reuseing Zellen verändert

ich diesen Code verwenden .....

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier [email protected]"Cell"; 
    UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; 


    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ; 
     cell.selectionStyle=UITableViewCellSelectionStyleGray; 
     cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; 
     UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(5, 12, 20, 20)]; 
     imageview.tag=n; 
     [cell.contentView addSubview:imageview]; 
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tabimage:)]; 
     imageview.userInteractionEnabled=YES; 
     [imageview addGestureRecognizer:tap]; 
     imageview.image=[UIImage imageNamed:@"img1.jpeg"]; 

     UILabel *titleLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 2, 260,26)]; 
     titleLabel.tag=222; 
     titleLabel.backgroundColor=[UIColor clearColor]; 
     [cell.contentView addSubview:titleLabel]; 

     UILabel *dateLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 31, 260, 13)]; 
     dateLabel.tag=333; 
     dateLabel.font=[UIFont systemFontOfSize:10]; 
     dateLabel.backgroundColor=[UIColor clearColor]; 
     [cell.contentView addSubview:dateLabel]; 
    } 
    UIImageView *imageview1=(UIImageView*)[cell.contentView viewWithTag:n]; 
    if([array containsObject:[NSNumber numberWithInt:imageview1.tag]]) { 
     imageview1.image=[UIImage imageNamed:@"img2.jpeg"]; 
    } else { 
     imageview1.image=[UIImage imageNamed:@"img1.jpeg"]; 
    } 

    UILabel *titlelable=(UILabel*)[cell.contentView viewWithTag:222]; 
    titlelable.text=[task objectAtIndex:indexPath.section]; 
    NSLog(@"%i",indexPath.section); 

    UILabel *dateLabel=(UILabel*)[cell.contentView viewWithTag:333]; 
    dateLabel.text=[date objectAtIndex:indexPath.section]; 
    n++; 
    return cell; 
} 

- (void)tabimage:(id)sender { 
    UIImageView *iv=(UIImageView *)[sender view]; 
    int i=iv.tag; 
    NSLog(@"------------%i",i); 
    if (iv.image==[UIImage imageNamed:@"img1.jpeg"]) { 
     iv.image= [UIImage imageNamed:@"img2.jpeg"]; 
     [array addObject:[NSNumber numberWithInt:i]]; 
    } else { 
     iv.image= [UIImage imageNamed:@"img1.jpeg"]; 
     [array removeObject:[NSNumber numberWithInt:i]]; 
    } 
    } 
+2

.. . und? Was ist dein Problem? – Cyrille

Antwort

2

i Lösung für meine app bin immer,

zur Verwendung von dynamischer Zellkennung in meinem Code

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

Genau das ist meine Antwort, warum hast du meine dann nicht akzeptiert? –

4

Welches Problem Sie auch sehen, die Verwendung des "n" ist höchstwahrscheinlich das Problem. Es gibt keinen guten Grund, eine gemeinsam genutzte Variable zum Markieren (und Abrufen) von Ansichten in Tabellenansichtszellen zu verwenden.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath wird oft aufgerufen, es kann mehrere Male für die gleiche Zelle aufgerufen werden, und manchmal findet es eine Zelle wieder zu verwenden, und manchmal nicht.

Ich habe natürlich keine Ahnung, was n ist, und wie Sie es an anderer Stelle in Ihrem Code verwenden, aber Sie ändern es bei jedem Aufruf hier, und Sie können keine Annahmen machen, wenn diese Methode aufgerufen wird, so ist es wertlos.

Sie wissen sicher, dass jede Zelle ein Bild mit diesem Tag hat, aber wenn es nach dem ersten Durchlauf immer verfügbar ist oder nicht, ist es bei jeder Wiederverwendung grundsätzlich zufälliges Verhalten (entweder a frische neue Zelle oder eine wiederverwendete Zelle mit einem Tag, den du nicht kennst).

Fragen Sie sich (oder vielleicht bei SO in einer anderen Frage): Was versuchen Sie hier zu erreichen?

+0

Einverstanden, ich sehe nicht, dass 'n' im Code * irgendwo * gesetzt ist, also können wir selbst mit diesem massiven Block des Codes nicht vollständig sagen, was vor sich geht. –

8

Sie sollten Ihre Zellkennung von statisch zu dynamisch ändern, die Ihr Problem lösen wird.

Sie sollten diese

static NSString *CellIdentifier [email protected]"Cell"; 
UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; 

mit diesem

UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%d %d"], indexPath.row, indexPath.section]; 
+0

es funktioniert korrekt NSString * CellIdentifier = [NSString stringWithFormat: @ "% i-% i", indexPath.Abschnitt, indexPath.row]; –

1

Ich schlage vor, ersetzen die UITableViewCell es alle Elemente, um Ihre benutzerdefinierte Add Unterklasse, erstellen Setter dafür. Und in cellForRowAtIndexPath rufen Sie einfach Ihre Setter an.

0

Wie Sie Tag zu Imageview in If (Zelle == Nil) Block festlegen bedeutet, wird Tag festgelegt, wenn Zelle erstellt wird. In Ihrem Fall werden 7 Zellen erstellt, nachdem die Zellen durch die Auslagerung wiederverwendet wurden. Daher werden ab 8 bereits zuvor erstellte Zellen verwendet. Aus diesem Grund sind Ihre Tags die gleichen wie 1,2,3 ... für 8,9,10 ... Zellen.

Nun, Alex schlug eine Standardmethode vor. Aber wenn Sie nicht benutzerdefinierte Zellen noch verwendet haben, können Sie versuchen, this-

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier [email protected]"Cell"; 
    UITableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UIImageView *imageview = nil;  
    if(cell){ 
     for (UIView *view in cell.contentView.subviews){ 
      if([view isKindOfClass:[UIImageView class]]){ 
        imageview = (UIImageView*)view; 
        break; 
      } 
     } 
    } 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] ; 
     cell.selectionStyle=UITableViewCellSelectionStyleGray; 
     cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; 
     imageview=[[UIImageView alloc]initWithFrame:CGRectMake(5, 12, 20, 20)]; 
     [cell.contentView addSubview:imageview]; 
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tabimage:)]; 
     imageview.userInteractionEnabled=YES; 
     [imageview addGestureRecognizer:tap]; 
     imageview.image=[UIImage imageNamed:@"img1.jpeg"]; 

     UILabel *titleLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 2, 260,26)]; 
     titleLabel.tag=222; 
     titleLabel.backgroundColor=[UIColor clearColor]; 
     [cell.contentView addSubview:titleLabel]; 

     UILabel *dateLabel=[[UILabel alloc]initWithFrame:CGRectMake(30, 31, 260, 13)]; 
     dateLabel.tag=333; 
     dateLabel.font=[UIFont systemFontOfSize:10]; 
     dateLabel.backgroundColor=[UIColor clearColor]; 
     [cell.contentView addSubview:dateLabel]; 
    } 
    imageview.tag=n; 
    if([array containsObject:[NSNumber numberWithInt:imageview.tag]]) { 
     imageview.image=[UIImage imageNamed:@"img2.jpeg"]; 
    } else { 
     imageview.image=[UIImage imageNamed:@"img1.jpeg"]; 
    } 

    UILabel *titlelable=(UILabel*)[cell.contentView viewWithTag:222]; 
    titlelable.text=[task objectAtIndex:indexPath.section]; 
    NSLog(@"%i",indexPath.section); 

    UILabel *dateLabel=(UILabel*)[cell.contentView viewWithTag:333]; 
    dateLabel.text=[date objectAtIndex:indexPath.section]; 
    n++; 
    return cell; 
}