2010-04-17 12 views
17

Tengo una aplicación de datos centrales que utiliza un controlador de navegación para obtener una vista detallada y luego, si edita una de las filas de datos en la vista de detalles, se le lleva a una vista de edición para esa línea única, como en Ejemplo de AppData CoreDataBooks (excepto que CoreDataBooks solo usa un UITextField por sí mismo, ¡no uno que es una subvista de UITableViewCell como la mía)!¿Subvista UITextField de UITableViewCell para convertirse en el primer respondedor?

La vista de edición es UITableviewController que crea su tabla con una sola fila de una sola fila y 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 se mueve moviéndose por la pantalla, quiero que el campo de texto se seleccione como firstResponder para que el teclado ya se está mostrando a medida que la vista se mueve por la pantalla para tomar posición. Al igual que en la aplicación Contactos o en la aplicación CoreDataBooks.

que actualmente tiene el siguiente código en mi aplicación que hace que el fin de cargar y entonces ver aparecer el teclado (que no es lo que yo quiero, yo quiero el teclado ya esté allí)

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

No puede poner esto en -viewWillAppear ya que el campo de texto no se ha creado todavía así que theTextField es nil. En la aplicación CoreDataBooks, donde logran lo que quiero, cargan su vista desde una punta para que usen 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 semilla, quiero mantener la implementación programática para permitir una mayor flexibilidad.

Muchas Gracias

Respuesta

15

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

Lo que hay que hacer es crear un fuera de la pantalla UITextField en -(void)loadView; y luego configurarlo como primer nivel de respuesta de entonces el método viewDidLoad puede establecer el UITextField en el UITableViewCell ser el primero en responder. Heres un código de ejemplo (recuerde que estoy haciendo esto en un UITableViewController por lo que estoy creando el tableview así!

- (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 atrapado en la misma posición que yo!

Si cualquier otra persona puede ver una mejor manera de hacer esto, por favor diga.

+3

He luchado con esto por más de un año. A veces obtengo una solución que funcionaría, pero luego una nueva actualización de iOS la rompería. Muy molesto. Esta es la mejor solución que he visto hasta la fecha, a pesar de lo hacky que se siente. –

+0

Gracias por este gran truco, pero no entiendo por qué necesitamos 'hiddenTextField'? ¿Point 'hiddenTextField' y 'theTextField' apuntan a la misma instancia de UITextField? –

+0

cuando usa este "truco", ¿puede ver el cursor? Lo he intentado con una uitableviewcell personalizada con una vista de uitext: el teclado se abre pero no se enfoca en la vista de uitext. – Sefran2

3

creo que la solución obvia es crear el campo de texto en el método del controlador de vista init. Normalmente es donde configura la vista porque un controlador de vista requiere una propiedad de vista poblada.

entonces se puede establecer el campo de texto como primer nivel de respuesta en viewWillAppear y el teclado debe ser visible como la vista se desliza en

+0

Actualmente creo el UITextField en - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath junto con la celda. Inicialicé el UITextField en el método init y colocando becomeFirstResponder en la vistaWillApper funcionó, pero el teclado todavía no se deslizaba y apareció una vez que se deslizó la vista. ¡Lo que no puedo entender!?! –

+0

No, debe crear un nuevo texto archivado en la vista de detalles y configurarlo como el primer respondedor. Si configura eso antes de que la vista realmente aparezca, debería aparecer con el teclado ya visible. No puede transferir el primer respondedor de una vista a otra vista insertada en la pila de navegación. El primer respondedor de la tabla no tendrá ningún efecto en el primer respondedor de la vista de navegación independientemente de cómo aparezca para el usuario. – TechZen

+0

La vista de detalle es la vista que el usuario está mirando actualmente antes de que toquen una fila para llevarlos a la vista de edición que tiene el campo de texto en ella. No estoy seguro si entiendo cómo poner un campo de texto con el primer respondedor en una vista que está a punto de "desaparecer" hará que aparezca un teclado en la vista a punto de "aparecer". La razón por la que creo que esto no funciona es porque la vista de tabla no se crea hasta que aparece la vista, por lo que no puede seleccionar el primero en el campo de texto actual antes de que aparezca la vista, ya que aún no se ha creado ! Pero luego parece que Apple lo hace en la aplicación Contactos de alguna forma, como –

2

¿Ha intentado utilizar los métodos de delegado UINavigationController ?:

navigationController:. WillShowViewController: animada :

+0

Hola removedor, ¡gracias por tu respuesta! Acabo de probarlo y no funcionó otra vez. UITextField es nulo en el momento que navigationController: willShowViewController: animated: se llama Creo por las mismas razones que las anteriores. A menos que esté lejos de crear el campo de texto en la tabla antes de que se cargue la vista, supongo que la única manera debe ser hacerlo desde un plumín. –

5

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

Cuestiones relacionadas