2012-10-03 19 views
5

estoy creando celda personalizado contiene UILabel, UIImageView, vía punto constante de UILabel, UIImageView usando la etiqueta dinámica, la tabla tiene 11 celdas, los primeros 7 celdas de carga correctamente, el 8, 9, 10, 11 vista de imagen de celda cambiar cuando estoy cambiando la 1, 2, 3, 4, celda respectivamente en la tabla, también las etiquetas son las mismas en las celdas, estoy usando las imágenes para marcar la casilla en la tabla, UITapGestureRecognizer usado para cambiar imageview en la tabla,qué etiqueta cambió en tableview a las células reuseing

estoy usando el código .....

- (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

.. y? ¿Cuál es tu problema? – Cyrille

Respuesta

2

que estoy recibiendo solución para mi aplicación,

a la utilización de identificador de celda dinámico en mi código

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

Esto es exactamente lo que mi respuesta fue, ¿por qué no aceptaste la mía entonces? –

4

Cualquiera sea el problema que vea, el uso de ese "n" es probablemente el problema. No hay una buena razón para usar una variable compartida para etiquetar (y recuperar) vistas en celdas de vista de tabla.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath se llama muchas veces, se puede llamar varias veces para la misma celda, y a veces se encuentra una celda para volver a utilizar, y a veces no.

No tengo ni idea de qué es n, y cómo lo usa en otro lugar de su código, pero lo cambia con cada llamada aquí, y no puede hacer suposiciones cuando se llama este método, por lo que no tiene valor.

Usted sabe con certeza que cada celda tiene una imagen con esa etiqueta, pero si alguna vez será accesible después de la primera ejecución o no está totalmente indefinido, entonces con cada reutilización básicamente obtiene un comportamiento aleatorio (ya sea nueva celda nueva o una reutilizada con una etiqueta que no conoce).

Pregúntese (o tal vez en SO en otra pregunta): ¿Qué está tratando de lograr aquí?

+0

De acuerdo, no veo que 'n' esté configurado * en cualquier lugar * en el código, por lo que incluso con ese bloque enorme de código no podemos decir por completo qué está sucediendo. –

8

Debe cambiar el identificador de su celular de estático a dinámico que resolverá su problema.

Debe reemplazar este

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

con este

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

funciona correctamente NSString * CellIdentifier = [NSString stringWithFormat: @ "% i-% i", indexPath.sección, indexPath.row]; –

1

Sugiero subclase el UITableViewCell poner allí todos sus elementos personalizados, crear incubadoras para ello. Y en cellForRowAtIndexPath simplemente llame a sus setters.

0

Como está configurando la etiqueta de la vista de la imagen en if (cell == nil) bloque significa que la etiqueta se establecerá cuando la celda se está creando. En su caso, se crean 7 celdas después de que las celdas se vuelven a usar mediante la eliminación. Por lo tanto, para 8 en adelante se usarán celdas previamente creadas. Esta es la razón por la que sus etiquetas son iguales a 1,2,3 ... para 8,9,10 ... células.

Bueno, Alex sugirió una forma estándar de hacerlo. Pero si usted no ha utilizado células personalizados sin embargo, puede intentar esto:

- (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; 
} 
Cuestiones relacionadas