2011-01-25 16 views
9

que tengo este problema extraño con mi tablaUITableViewCell - superposición con contenidos células anteriores

  1. Tengo alrededor de 20 celdas para mostrar
  2. Cada célula está a punto 84px de altura
  3. Cuando hago clic sin la célula , he establecido un color de fondo
  4. Las primeras 4 celdas están bien, pero cuando me desplazo hacia abajo y hago clic en la quinta celda, el contenido de cada celda comienza a superponerse con otro contenido, generalmente contenido de las primeras 4 celdas.

Creo que es un problema con la reutilización de la pila o el dibujo. No estoy seguro de cómo resolverlo, revisé mi código, pero no estoy cambiando el contenido de la celda al tacto.

Aquí está mi código y añadir un poco de las fotografías también Cell with overlapped content

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return 104; 
} 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return [stores count]; 
} 

-(UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    CGRect Label1Frame = CGRectMake(5, 5, 250, 30); 
    CGRect Label2Frame = CGRectMake(6, 42, 220, 20);  
    CGRect Label3Frame = CGRectMake(6, 62, 220, 20);   
    CGRect Label4Frame = CGRectMake(240,56, 70, 12);    

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if(cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; 
    }else{ 
     // a cell is being recycled, remove the old edit field (if it contains one of our tagged edit fields) 
     UIView *viewToCheck = nil; 
     viewToCheck = [cell.contentView viewWithTag:1]; 
     if (!viewToCheck) { 
      [viewToCheck removeFromSuperview]; 
      DebugLog(@"View removed"); 
     }  
    } 
    //cell.selectionStyle=UITableViewCellSelectionStyleNone; 
    [cell setSelectedBackgroundView:bgView];  
    NSInteger row=indexPath.row; 
    UILabel *lblTemp; 
    [[cell contentView] clearsContextBeforeDrawing]; 

    //Line 1 

    lblTemp=[[UILabel alloc] initWithFrame: Label1Frame]; 
    lblTemp.tag=1; 
    lblTemp.text=[[stores objectAtIndex:row] objectAtIndex:0] ; 
    lblTemp.numberOfLines=2; 
    lblTemp.font = [UIFont boldSystemFontOfSize:13]; 
    lblTemp.adjustsFontSizeToFitWidth=YES; 
    lblTemp.minimumFontSize=12; 
    lblTemp.textColor = [UIColor grayColor]; 
    [cell.contentView addSubview:lblTemp]; 
    [lblTemp release]; 
    //Line 2 
    lblTemp = [[UILabel alloc] initWithFrame:Label2Frame]; 
    lblTemp.tag = 2; 
    lblTemp.text=[[stores objectAtIndex:row]objectAtIndex:1]; 
    lblTemp.font = [UIFont systemFontOfSize:12]; 
    lblTemp.textColor = [UIColor grayColor ]; 
    lblTemp.textAlignment=UITextAlignmentLeft; 
    lblTemp.adjustsFontSizeToFitWidth=YES; 
    lblTemp.minimumFontSize=12; 

    [cell.contentView addSubview:lblTemp]; 
    [lblTemp release]; 

    //Line 3  
    lblTemp = [[UILabel alloc] initWithFrame:Label3Frame]; 
    lblTemp.tag = 3; 
    lblTemp.text=[[stores objectAtIndex:row]objectAtIndex:2]; 
    lblTemp.font = [UIFont systemFontOfSize:12]; 
    lblTemp.textColor = [UIColor grayColor ]; 
    [cell.contentView addSubview:lblTemp];  
    [lblTemp release]; 
    //Phone button 
    UIButton *phoneButton=[[UIButton alloc] initWithFrame:CGRectMake(240,16,30,30)]; 
    [phoneButton setBackgroundImage:[UIImage imageNamed:@"phone.png"] forState:UIControlStateNormal]; 
    [phoneButton setTag:row]; 
    [phoneButton addTarget:self action:@selector(dialNumber:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.contentView addSubview:phoneButton]; 
    //ANnotation button 
    UIButton *annotation=[[UIButton alloc] initWithFrame:CGRectMake(274,16,30,30)]; 
    [annotation setTag:row]; 
    [annotation setBackgroundImage:[UIImage imageNamed:@"tab.png"] forState:UIControlStateNormal]; 
    [annotation addTarget:self action:@selector(openMap:) forControlEvents:UIControlEventTouchUpInside];  
    [cell.contentView addSubview:annotation]; 
    [annotation release]; 
    //Distance label 
    //Line 3  
    lblTemp = [[UILabel alloc] initWithFrame:Label4Frame]; 
    lblTemp.tag = 4; 
    lblTemp.text=[[stores objectAtIndex:row]objectAtIndex:5]; 
    lblTemp.textAlignment=UITextAlignmentCenter; 
    lblTemp.font = [UIFont systemFontOfSize:13]; 
    lblTemp.textColor = [UIColor grayColor ]; 
    [lblTemp setAdjustsFontSizeToFitWidth:YES]; 
    [cell.contentView addSubview:lblTemp];  
    [phoneButton release]; 
    [lblTemp release]; 
    [cell setNeedsLayout]; 
    [cell setNeedsDisplay]; 
    return cell; 
} 
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell=[tableView cellForRowAtIndexPath:indexPath ]; 
    for(UILabel *lbl in cell.contentView.subviews){ 
     if([lbl isKindOfClass:[UILabel class]]){ 
      lbl.textColor=[UIColor whiteColor]; 

     } 
    } 
    //UITableViewCell *cell1;  
    //NSString *row=[NSString stringWithFormat:@"%d",indexPath.row]; 
    svm = [[storesMapView alloc] initWithNibName:@"storesMapView" bundle:nil]; 
    [svm initWithXML:stores:indexPath.row]; 
    CGRect theFrame = svm.view.frame; 
    theFrame.origin = CGPointMake(self.view.frame.size.width, 0); 
    svm.view.frame = theFrame; 
    theFrame.origin = CGPointMake(0,0); 
    theFrame.size=CGSizeMake(320,355); 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.3f]; 
    svm.view.frame = theFrame; 
    [UIView commitAnimations]; 
    [subView addSubview:svm.view]; 
    backButton.hidden=NO; 


} 
+0

Realmente deberías construir celdas como esta en una punta, en lugar de hacer todo en cellForRow. – Mark

+0

Puedes ver la respuesta aquí también.Claramente explicado. http://stackoverflow.com/questions/8999300/labels-in-custom-cell-overlaps – user3675974

+0

tengo el mismo problema pero mis subvistas no se ejemplifican en el código sino que provienen de un guión gráfico. si se eliminan las subvistas, todas se han ido. ¿Como puedo resolver esto? – DamirDiz

Respuesta

19

lo he descubierto con un poco de ensayo y error; si esto puede ayudar a alguien

En cellForRowAtIndexPath i trató de despejar todas las células subvista antes de sacar la célula

//TRY TO REMOVE ALL CONTENT 
    for(UIView *view in cell.contentView.subviews){ 
     if ([view isKindOfClass:[UIView class]]) { 
      [view removeFromSuperview]; 
     } 
    } 

Yo sería feliz si alguien me puede apuntar a alguna forma más fácil

Gracias

+0

¡¡Solución agradable ... !! – TheTiger

+1

La manera más fácil es hacer todas las vistas agregadas dinámicamente en una subvista común y eliminar todas las subvistas de esta vista en el método prepareForReuse de UITableViewCell –

+0

@ La sugerencia de Nikolay Kasyanov anterior es el lugar correcto para hacerlo. – Echelon

7

puede utilizar

[[[cell contentView] subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)]; 

Si la celda en la que no nulo, el código anterior se reducirá el tiempo para usar el bucle for similar a este

for(UIView *eachView in [cell subviews]) 
    [eachView removeFromSuperview]; 
1

Sé que esto es un poco tarde, pero tuve un problema similar donde UILabels creados para una la célula todavía era parte de la célula cuando se reutilizó. Por lo tanto, cada actualización sucesiva de la tabla creó otro UILabel encima del existente. Moví la creación de las etiquetas a la condición if de la siguiente manera y resolvió mi problema. Espero que ayude a alguien más. También tenga en cuenta que no hay lanzamiento ya que estoy usando ARC.

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) 

    { 

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    cityText = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 20)]; 
    cityText.font = [UIFont fontWithName:@"Arial" size:20]; 
    cityText.textAlignment = UITextAlignmentLeft; 
    cityText.backgroundColor = [UIColor clearColor]; 

    regionText = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 100, 20)]; 
    regionText.font = [UIFont fontWithName:@"Arial" size:20]; 
    regionText.textAlignment = UITextAlignmentLeft; 
    regionText.backgroundColor = [UIColor clearColor]; 

    } 
5

También tuve la misma issue.I también había compuesto tableView con labels.And cuando me desplazo hacia abajo el contenido consiguieron overlapped.But que se resolvió simplemente editando una declaración en cellForRowAtIndexPath.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; 

Creo que esto resolverá su problema.

+0

Este código funciona para mí. – anjaly

0

Configuración nula para etiquetar texto en subclase 'S método de UITableViewCell prepareForReuse() resuelto mi problema -

override func prepareForReuse() { 
    super.prepareForReuse() 
    self.label1.text = nil 
    self.label2.text = nil 
    .... 
} 

compartida si se ayuda a nadie!

Cuestiones relacionadas