2010-12-31 14 views
11

He buscado en Internet un buen tutorial o publicado acerca de tener una UITableView poblada con un UITextField en cada celda para la entrada de datos.UITextField en UITableViewCell Help

Quiero hacer un seguimiento de cada UITextField y el texto escrito dentro mientras se desplaza. TableView será seccionado. He estado usando una UITableViewCell personalizada, pero estoy abierto a cualquier método.

Además, ¿es posible usar textFields como ivars?

Si alguno de ustedes pudiera señalarme en la dirección correcta, sería muy apreciado.

¡Gracias de antemano!

+0

He publicado una continuación de esta pregunta en este hilo. http://stackoverflow.com/questions/4635856/first-and-last-uitableviewcell-keep-changing-while-scrolling/4636024#4636024 –

Respuesta

10

Para resolver su problema, debe mantener una matriz, con algún número (número de campos de texto que haya agregado a todas las celdas) de los objetos.

Al crear esa matriz, necesita agregar objetos NSString vacíos a esa matriz. y cada vez que carga la celda debe reemplazar el objeto respetado por textField respetado.

Compruebe el siguiente código.

- (void)viewDidLoad{ 
    textFieldValuesArray = [[NSMutableArray alloc]init]; 
    for(int i=0; i<numberofRows*numberofSections; i++){ 
     [textFieldValuesArray addObject:@""]; 
    } 

} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    // Return the number of sections. 
    return numberofSections; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return numberofRows; 
} 

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; 

    CustomTextField *tf = [[CustomTextField alloc] initWithFrame:CGRectMake(5,5,290,34)]; 
    tf.tag = 1; 
    [cell.contentView addSubView:tf]; 
    [tf release]; 
    } 
    CustomTextField *tf = (CustomTextField*)[cell viewWithTag:1]; 
    tf.index = numberofSections*indexPath.section+indexPath.row; 
    tf.text = [textFieldValuesArray objectAtIndex:tf.index]; 

    return cell; 
    } 

- (void)textFieldDidEndEditing:(UITextField *)textField{ 

    int index = textField.index; 
    [textFieldValuesArray replaceObjectAtIndex:index withObject:textField.text]; 
} 

Saludos,

Satya

+0

Funcionará esto para una tabla seccionadaVer si utilizo la instrucción switch normal en cellForRow? –

+0

esto funcionará también para la vista de tabla seccionada, pero debemos mantener cierto índice. Voy a cambiar el código de verificación que. – Satya

+0

¿Actualizaría el número de etiqueta de cada campo de texto? –

9

En primer lugar, hay que entender que UITableViewCell y UITextField son sólo puntos de vista, no se supone que para mantener los datos, no son más que supone para mostrarlos y permitir el usuario para interactuar con ellos: los datos deben permanecer almacenados en el controlador de la vista de tabla.

Debe recordar que UITableView le permite reutilizar las instancias de UITableViewCell para fines de rendimiento: lo que se muestra en la pantalla son en realidad las únicas subclases que UITableView guarda allí. Significa que reutilizará una celda que ya tiene un campo de texto y establecerá el texto directamente en ese campo. Cuando el usuario toque el campo, lo editará y tendrá que recuperar el valor cuando el usuario haya terminado.

La manera más rápida, sería usar lo que propone Satya, que es construir UITableViewCell normal e insertarlo en un UITextField (no hay necesidad de una clase CustomTextField ...). La etiqueta le permitirá regresar fácilmente al campo de texto ... Pero deberá configurar su campo de texto para que se comporte correctamente cuando la vista de tabla cambie de tamaño o cambie una etiqueta en la misma celda.

La forma más limpia de hacer eso es subclasificar UITableViewCell y configurar el diseño de su etiqueta y campo de texto, y puede proporcionar el campo de texto como una propiedad de la subclase personalizada.

3

He utilizado Textfields en tableview para la entrada de datos. He personalizado la clase UITextField en una clase separada llamada Utilidad:

En Utility.h

@interface CustomUITextField:UITextField{ 
     NSInteger rowNumber; 
    } 

En Utilidad.m

@implementation CustomUITextField 

@synthesize rowNumber; 
@end 

Mi método tableView cellForRowAtIndexPath es

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

    static NSString *Identifier = @"Cell"; 
    UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:Identifier]; 
    if(cell == nil) 
     cell = [self reuseTableViewCellWithIdentifier:Identifier withIndexPath:indexPath]; 

    CustomUITextField *itemNameTextField = (CustomUITextField *)[cell.contentView viewWithTag:TEXTFIELD_TAG];//this is the tag I have set in reuseTableViewCellWithIdentifier method for textfield 
    itemNameTextField.rowNumber = indexPath.row; 
    itemNameTextField.text = @"";//you can set it for the value you want 
    if(itemListTable.editing) 
     itemNameTextField.borderStyle = UITextBorderStyleRoundedRect; 
    else 
     itemNameTextField.borderStyle = UITextBorderStyleNone; 



    return cell; 

} 

Usted puede personalizar los métodos de delegado de UITextField para CustomUITextField & puede guardar el texto introducido en el campo de texto de una fila en particular accediendo número de fila de la CustomTextField.

Intente con esto.

+0

mejor sería usar @property (no atómico, retener) NSIndexPath * indexPath; – johndpope

0

Tuve el mismo problema aquí es algún código que encontré que trata este problema. introduce los datos en una Mirada de Array en la consola del Depurador para ver los resultados del texto que se tipea. Aquí está el enlace TextFieldCell.. Happy Codeing