2011-09-08 38 views
6

necesito para obtener el NSIndexPath para una celda personalizado en un UITableView. Aquí está el problema: Envío un NSNotification de mi celda personalizado a mi UITableViewController cuando editingDidBegin se llama a partir de una UITextField en mi celda personalizado. En mi UITableViewController, puedo cambiar el tamaño de la UITableView cuando el UITextField comenzó a editar, y luego quiero la vista de tabla para desplazarse a la celda en la que el UITextField es el primero en responder. Pero no puedo encontrar la manera de devolver el indexPath de la celda en la que se está editando el UITextField. Lo he intentado de muchas maneras, pero todavía no está funcionando. Una forma es la siguiente: en mi clase cstomCell selecciono la fila usando [self setSelected:YES] y en mi controlador de televisión, entonces si NSLog la fila de [self.tableV indexPathForSelectedRow] siempre devuelve 0 a pesar de su siempre 0. No¿Devuelve NSIndexPath desde la celda personalizada? (UITableView)

+0

¿no prefieres obtener su 'frame'? – aopsfan

Respuesta

14

acaba de dar la celda un valor para es tag propiedad. Entonces se puede obtener esa celda llamando a este

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue]; 

continuación, una vez que tenga la celda se puede obtener el NSIndexPath como esto

NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell]; 

Puesto que usted tiene un UITextField en su celda personalizado puede colocar cell.textField.delegate = self; en el método de fuente de datos

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

. De esta forma, no tendrá que configurar una NSNotification en la celda personalizada. También en este mismo método se puede etiquetar tanto sus células campo de texto como este cell.textField.tag = indexPath.row; y la célula como esto cell.tag = indexPath.row;

Ahora que ha configurado el delegado UITextField, ahora se puede poner este método en su clase UITableViewController

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

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag]; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];   

} 

lo anterior UITextField método delegado debe conseguir que el indexPath de la celda que ha seleccionado actualmente.

+0

No lo entiendo, proporcione un código más. No hay relación entre las dos líneas de código, díganme dónde poner qué línea de código. – JonasG

+0

@Maxner He editado mi respuesta. Espero que aclare cualquier confusión. – ms83

-1

me gusta etiquetar mis células, así:

/* Create a tag based on the section and row of a cell(used to retrive the cell for the beginEditingNextCell method. */ 
-(NSInteger)tagForIndexPath:(NSIndexPath*)path { 
    return path.section * 1000 + path.row + 1; 
} 

La otra manera es pasar los datos beginEditing utilizando un delegado de encargo, e incluyen un modelo de células, que luego se puede utilizar para calcular su ruta dependiendo de cómo está almacenando datos.

Salida mi proyecto github, tiene el código para manejar este caso, así como el cambio de tamaño para el teclado y la tabulación a la siguiente celda editable: https://github.com/andrewzimmer906/XCell

+0

Su proyecto github es un desastre completo, al menos 20 errores y advertencias en la compilación. ¿Podrías proporcionarme más código, solo relacionado con mi pregunta? Tengo una recompensa abierta de 50. – JonasG

0

tratar este código ..

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    UITableView *tableView; 
    UITableViewCell* superViewCell = [self returnSuperCellViewOfTextField:textField]; 
    if(superViewCell)[tableView scrollToRowAtIndexPath:[tableView indexPathForCell:superViewCell] atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
} 

-(id)returnSuperCellViewOfTextField:(id)viewToCheck 
{ 
    id superView = [viewToCheck superview]; 
    if([viewToCheck isKindOfClass:[UITableViewCell class]] && superView)return superView; 
    else if(([viewToCheck respondsToSelector:@selector(superview)] && superView)) return [self returnSuperCellViewOfTextField:superView]; 
    return nil; 
} 
0

hace esto (su respuesta que diste antes abajo) todavía funciona si tiene varias texfields en cada célula ?:

UITableViewCell *cell = (UITableViewCell *)[self.tableView viewWithTag:tagValue]; 
then once you have the cell you can get the NSIndexPath like this 

NSIndexPath *indexPath = [self.tableView indexPathForCell:nextResponderCell]; 

Puesto que usted tiene un UITextField en su celda personalizado se puede colocar en el método cell.textField.delegate = self; fuente de datos

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

. También en este mismo método puede etiquetar el campo de texto de sus celdas como este cell.textField.tag = indexPath.fila; y la celda como esta cell.tag = indexPath.row;

Ahora que ha configurado el delegado UITextField, ahora se puede poner este método en su clase UITableViewController

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

    CustomCell *cell = (CustomCell *)[self.tableView viewWithTag:textField.tag]; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

tengo un tableview con 8 células, y en cada célula tengo 6 texfields, y también el tableview es dinámico, por lo que el usuario puede insertar más celdas ... pero tengo problemas para guardar el texto que el usuario ingresa en cada texfield. ¿Es posible que con "cell.textField.tag = indexPath.row", el controlador identifique el texfield en el que estoy?

Cuestiones relacionadas