iphone cocoa-touch uitableview becomefirstresponder

iphone - ¿La subvista UITextField de UITableViewCell se convertirá en el primer respondedor?



cocoa-touch becomefirstresponder (4)

Tengo una aplicación de datos centrales que usa un controlador de navegación para profundizar en una vista de detalle y luego, si edita una de las filas de datos en la vista de detalles, lo llevarán a una Vista de edición para esa única línea, como en Apples CoreDataBooks. Ejemplo (excepto que CoreDataBooks solo usa un UITextField por sí solo, no uno que sea una subvista de UITableViewCell como el mío).

La vista de edición es un UITableviewController que crea su tabla con una sola fila de una sola sección y un UITextfield de UITextfield en la celda, programáticamente.

Lo que quiero que suceda es cuando selecciona una fila para editar y la vista de edición se inserta en la pila de navegación y la vista de edición está animada moviéndose a través de la pantalla. a medida que la vista se desplaza por la pantalla para tomar posición. Al igual que en la aplicación Contactos o en la aplicación CoreDataBooks.

Actualmente tengo el siguiente código en mi aplicación que hace que se cargue la vista y luego ves que aparece el teclado (que no es lo que quiero, quiero que el teclado ya esté allí)

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [theTextField becomeFirstResponder]; }

No puedes poner esto en -viewWillAppear porque el campo de texto aún no se ha creado, por lo que el theTextField es nulo. En la aplicación CoreDataBooks, donde logran lo que quiero, cargan su vista desde una punta, por lo que usan el mismo código, pero en -viewWillAppear ya que el campo de texto ya se ha creado.

¿Hay alguna forma de evitar esto sin crear una punta, quiero mantener la implementación programática para permitir una mayor flexibilidad?

Muchas gracias


¿Has intentado usar los métodos de delegado uinavigationcontroller ?:

navigationController: willShowViewController: animated:


Creo que la solución obvia es crear el campo de texto en el método init del controlador de vista. Por lo general, es donde se configura la vista porque un controlador de vista requiere una propiedad de vista poblada.

Luego, puede configurar el campo de texto como primer respondedor en viewWillAppear y el teclado debería estar visible a medida que la vista se desliza.


Después de hablar con el equipo de soporte técnico de Apple Dev, ¡tengo una respuesta!

Lo que debe hacer es crear un UITextField fuera de pantalla en -(void)loadView; y luego viewDidLoad como primer respondedor y luego en el método viewDidLoad puede configurar el UITextField en el UITableViewCell para ser el primer respondedor. Aquí hay un código de ejemplo (recuerda que estoy haciendo esto en un UITableViewController así que también estoy creando la vista de tabla.

- (void)loadView { [super loadView]; //Set the view up. UIView *theView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.view = theView; [theView release]; //Create an negatively sized or offscreen textfield UITextField *hiddenField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, -10, -10)]; hiddenTextField = hiddenField; [self.view addSubview:hiddenTextField]; [hiddenField release]; //Create the tableview UITableView *theTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] bounds] style:UITableViewStyleGrouped]; theTableView.delegate = self; theTableView.dataSource = self; [self.view addSubview:theTableView]; [theTableView release]; //Set the hiddenTextField to become first responder [hiddenTextField becomeFirstResponder]; //Background for a grouped tableview self.view.backgroundColor = [UIColor groupTableViewBackgroundColor]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //Now the the UITableViewCells UITextField has loaded you can set that as first responder [theTextField becomeFirstResponder]; }

Espero que esto ayude a cualquiera atrapado en la misma posición que yo!

Si alguien más puede ver una mejor manera de hacerlo, por favor diga.


Intenta hacerlo en el método viewDidAppear, funciona para mí.