UITableViewCell con UITextField perdiendo la capacidad de seleccionar la fila UITableView?

Casi he terminado de implementar un UITableViewCell con un UITextField en él. En lugar de pasar por CGRectMake y UITableViewCell.contentView lo he implementado de la manera más simple:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; amountField.placeholder = @"Enter amount"; amountField.keyboardType = UIKeyboardTypeDecimalPad; amountField.textAlignment = UITextAlignmentRight; amountField.clearButtonMode = UITextFieldViewModeNever; [amountField setDelegate:self]; [[cell textLabel] setText:@"Amount"]; [cell addSubview:amountField]; return cell; } 

Y luego también implementé el método didSelectRow , renunciando a textField para permitir mostrar las otras vistas de input de campos.

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { ... [amountField resignFirstResponder]; ... } 

Esto funciona sin problemas, solo hay otras filas en la tabla, cuando se seleccionan esas otras, se selecciona la celda completa y se vuelve azul, mientras que la que está con mi UITextField no lo hace, me refiero al campo seleccionado y puedo ingresar text pero la celda no está seleccionada. Lo he probado y he descubierto que el problema está en la línea:

 [cell addSubview:amountField]; 

Parece que esto rompe el comportamiento de celda seleccionable, e incluso agregarlo a [cell contentView] no soluciona esto. ¿Me he perdido algo?

Si el campo de text tiene userInteractionEnabled establecido en YES , y llena toda la celda, no puede hacer que la celda escuche tocar. Para que la celda responda toques, necesita configurar userInteractionEnabled del campo de text en NO .

Edit: Y si desea hacer que el campo de text sea editable, cuando se selecciona la celda, agregue el siguiente código en didSelectRowAtIndexPath: method,

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // get the reference to the text field [textField setUserInteractionEnabled:YES]; [textField becomeFirstResponder]; } 

No ha roto nada al agregar una subvista, en cambio el UITextField está capturando el toque por delante de UITableViewCell. Puede probar esto tocando fuera del UITextField pero dentro de los límites de UITableViewCell y verá que, de hecho, todavía selecciona como era de esperar.

Para resolver esto, puede subclass UITextField y agregar una propiedad UITableView. Establezca la propiedad cuando cree una instancia de UITextField y agréguela a la celda.

 amountField.tableView = tableView; 

Entonces necesitará anular la function becomeFirstResponder en su subclass y, en el método, get la fila de la celda con UITextField y luego seleccionarla manualmente

 - (BOOL)becomeFirstResponder { // Get the rect of the UITextView in the UITableView's coordinate system CGRect position = [self convertRect:self.frame toView:self.tableView]; // Ask the UITableView for all the rows in that rect, in this case it should be 1 NSArray *indexPaths = [self.tableView indexPathsForRowsInRect:position]; // Then manually select it [self.tableView selectRowAtIndexPath:[indexPaths objectAtIndex:0] animated:YES scrollPosition:UITableViewScrollPositionNone]; return YES; } 

Lo primero es que no has usado celdas reutilizables. La encoding que proporcionó causará mucha memory.

Lo siguiente es que puede seleccionar la fila tocando el área que no sea el campo de text.

Una solución para sus preguntas es

En su delegado textField

 UITableViewCell *cell = (UITableViewCell *)[textField superView]; cell.selected=YES; //I think this will call the didSelectRowATIndex; 

No estoy seguro de que esto funcione. Pero vale la pena probarlo.

En primer lugar, necesitaba utilizar reuseIdentifier para cellForRowAtIndexPath, por lo que si no utiliza reuseIdentifier es: cuando se desplaza hacia arriba y hacia abajo, siempre asignará una nueva celda y nuevos campos de text, por lo que necesita poner cell == nil condición, por lo que el código revisado es aquí:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *reuseIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; if (cell==nil) { cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier] autorelease]; UITextField *amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; amountField.placeholder = @"Enter amount"; amountField.keyboardType = UIKeyboardTypeDecimalPad; amountField.textAlignment = UITextAlignmentRight; amountField.clearButtonMode = UITextFieldViewModeNever; [amountField setDelegate:self]; [cell.contentView addSubview:amountField]; } [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; [[cell textLabel] setText:@"Amount"]; return cell; } 

En el método didSelect delegate puedes hacer esto

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [prevField resignFirstResponder]; UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; UIView *view = [[cell.contentView subviews] lastObject]; if([view isKindOfClass:[UITextField class]]{ currentField = (UITextField*)view; } [currentField becomeFirstResponder]; prevField = currentField; } 

dentro de la celda de la fila en la ruta del índice agrega esta línea que se da en negrita,

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"]; [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; amountField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 190, 30)]; amountField.placeholder = @"Enter amount"; amountField.keyboardType = UIKeyboardTypeDecimalPad; amountField.textAlignment = UITextAlignmentRight; amountField.clearButtonMode = UITextFieldViewModeNever; [amountField setDelegate:self]; [[cell textLabel] setText:@"Amount"]; **for (UIView *cellSubViews in cell.subviews) { cellSubViews.userInteractionEnabled = NO; }** [cell addSubview:amountField]; return cell; } 

testing esto, funcionará