2011-05-29 11 views
5

Tengo un UITableView con aproximadamente 20 celdas, en cada celda hay tres UITextFields. NO subclasé UITableViewCell, pero al configurar cada celda configuré el valor de la etiqueta de los campos de texto en una constante más el número de fila. Entonces, para cada fila, la etiqueta del campo de texto se incrementa en uno.UITextFields en UITableView, los valores ingresados ​​reaparecen en otras celdas

Cuando ejecuto la aplicación e ingreso un valor en, por ejemplo, la fila uno, puede reaparecer en la fila 12. El comportamiento no es el mismo cada vez que ejecuto la aplicación.

Debo agregar que tengo una matriz que almacena los contenidos ingresados ​​en cada campo de texto. Cuando se edita un campo de texto, guardo el nuevo valor en la matriz y cuando la tabla vuelve a ser solicitada por la tabla, configuro el valor de los campos de texto como almacenados en la matriz.

¿Tiene esto algo que ver con reutilizar UITableViewCells? Al reutilizar una celda, ¿pueden los campos de texto en filas diferentes obtener los mismos números de etiqueta? Digamos, por ejemplo, que la primera celda (etiqueta de campo de texto = 1001) se reutiliza en la fila 12, luego tenemos dos campos de texto con el mismo número de etiqueta. Si luego ingreso un valor en la fila 1 y luego cargo la fila 12, el valor de la celda uno se cargará desde la matriz y también se colocará en la fila 12.

Si esto está sucediendo, ¿cómo lo arreglo? Cada célula no tiene una referencia al campo de texto, por lo que no creo que pueda editar el valor de etiqueta de un campo de texto con sólo tener acceso a la celda que está en

EDIT:.

Aquí es el código para UITableView: cellForRowAtIndexPath:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
      //Modify cell, adding textfield with row-unique index value 
      cell = [self modifyCellForHoleInfo:cell atIndexPath:indexPath]; 

    } 
    cell.accessoryType = UITableViewCellAccessoryNone; 

    // Load value for textfield stored in dataArray 
    ((UITextField *)[cell viewWithTag:1000+indexPath.row]).text = [dataArray objectAtIndex:indexPath.row]; 

¡Gracias!

+0

¿Puedes mostrar el código de 'tableView: cellForRowAtIndexPath'? No creo que valga la pena tener etiquetas dependiendo de la fila. – notnoop

Respuesta

6

El problema es que cuando la celda se reutiliza (es decir, dequeueReusableCellWithIdentifier devuelve no-nil), la celda se devuelve con el UITextView existente. Para mantener la singularidad de las etiquetas, que va a ser mejor para eliminar cualquier anterior UITextField:

- (void)removeExistingTextSubviews:(UITableViewCell *)cell 
{ 
    NSMutableArray *toRemove = [NSMutableArray array]; 
    // I don't know if you have non-TextField subviews 
    for (id view in [cell subviews]) { 
     if ([view isKindOfClass:[UITextField class]] && view.tag >= 1000) { 
      [toRemove insert:view]; 
     } 
    } 

    for (id view in toRemove) { 
     [toRemove removeFromSuperView]; 
    } 
} 

... 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} else { 
    [self removeExistingTextSubviews:cell]; 
} 
//Modify cell, adding textfield with row-unique index value 
cell = [self modifyCellForHoleInfo:cell atIndexPath:indexPath]; 
cell.accessoryType = UITableViewCellAccessoryNone; 

// Load value for textfield stored in dataArray 
((UITextField *)[cell viewWithTag:1000+indexPath.row]).text = [dataArray objectAtIndex:indexPath.row]; 

Tenga en cuenta que no he compilado el código, sino que debe servir como punto de partida.

+0

Genial, muchas gracias! –

1

acaba de obtener el texto de campo de texto en el diccionario setObject de texto de la etiqueta y comprobar de nuevo por el sello de texto asignar el texto al campo de texto correspondiente .. aquí es mi código ...

//In Interface 
NSMutableDictionary *amounts; 
amounts =[[NSMutableDictionary alloc]init]; 

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

static NSString *CellIdentifier = @"MoneyEntryIdentifier"; 
static NSString *CellNib = @"MoneyEntry"; 
MoneyEntryTableViewCell *cell = (MoneyEntryTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (!cell) 
{ 
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil]; 
cell = (MoneyEntryTableViewCell *)[nib objectAtIndex:0]; 
} 

UILabel  *lblname = (UILabel *) [cell lblMemName]; 
lblname.tag =100; 
UITextField *txtfield = (UITextField *)[cell textAmount]; 
txtfield.tag =indexPath.row; 

[txtfield addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; 
lblname.text = tabledata[indexPath.row]; 
txtfield.placeholder = [NSString stringWithFormat:@"%ld",(long)indexPath.row]; 


if ([amounts valueForKey:lblname.text] != nil) { 
txtfield.text = [amounts valueForKey:lblname.text]; 
} else { 
txtfield.text = @""; 
} 

cell.selectionStyle =UITableViewCellSelectionStyleNone; 
return cell; 
} 

-(void)textFieldDidChange:(UITextField *)txtField 
{ 
UILabel *label = (UILabel *)[txtField.superview viewWithTag:100]; 
NSString *labelString = label.text; 
NSString *textFieldString = txtField.text; 
[amounts setObject:textFieldString forKey:labelString]; 
} 

Cambiar la punta a su celular tableview ...

Cuestiones relacionadas