Programar para Iphone desde dos. UITextField. Nivel Barragán.
24 June 2008
¿Cómo estamos?
Hoy, avanzaremos un poquito en nuestro aprendizaje. Una de las principales funciones que debe hacer un programa es la adquisición de datos, y para ello tenemos la clase UITextField. Se trata sin más de un simple formulario, que por defecto al ser pulsado con el dedo (recordemos que el Iphone tiene pantalla táctil) desplegará un teclado virtual en la parte inferior de la pantalla
Empezamos:
Como este es el Artículo “Programar para Iphone desde Dos” me basare en los anteriores, “desde Cero” y "desde Uno" ,y doy por sabidas las cosas expuestas en ellos.
Explicación del ejemplo:
Para poder entender bien como funciona separaré el programa en dos vistas que ocupen la pantalla completa. Cada vista contará de un Botón para ir hacia la otra vista, y además un UITextField. El TextField de la primera vista nos servirá para adquirir los datos, y en el segundo (aunque podriamos utilizar un UILabel) nos servirá para copiar los datos que hayan sido introducidos en la vista anterior.
Creación del proyecto:
1.- Abrimos xcode.app y creamos un proyecto de tipo window.
Definición de Objetos y Acciones:
Como ya tenemos una cierta base ire al grano.
2.- En el archivo.h de nuestra app delegate, crearemos todos los Outlet y todas las Actions. También será conveniente deshabilitar el UITextField de la segunda vista.
#import <UIKit/UIKit.h>
@class TEXTFIELD_BLOGViewController;
@interface TEXTFIELD_BLOGAppDelegate : NSObject <UIApplicationDelegate>
{
IBOutlet UIWindow *window;
IBOutlet id VISTA1;
IBOutlet id VISTA2;
IBOutlet id TEXTFIELD1;
IBOutlet id TEXTFIELD2;
IBOutlet id BOTON_F;
IBOutlet id BOTON_B;
NSString *cadena;
}
- (IBAction) PULSAR_ENTER_EN_TEXTFIELD1: (id) sender;
- (IBAction) PULSAR_BOTON_F: (id) sender;
- (IBAction) PULSAR_BOTON_B: (id) sender;
@property (nonatomic, retain) UIWindow *window;
@end
Creación de interface y asignación de elementos:
3.- Ahora hacemos doble click sobre el archivo.xib para abrir y editar con el interface builder nuestra pantalla.
Arrastramos dos UIView a la ventana de MainWindow.xib y las nombramos como VISTA1 y VISTA2. Hacemos doble click sobre ellas para editarlas, y a cada una de las vistas le añadimos un UIButton y un UITextField.
Ya tenemos todos nuestros elementos creados, y solo nos queda vincularlos con nuestra App Delegate. Pues bien, pulsando el Control desde nuestra app delegate vinculamos los dos botones, las dos vistas y los dos TextField a los correspondientes IBOutlet que creamos en el Archivo.h . Después de esto, pulsando el Control vinculamos los botones con la App Delegate, asignando las acciones de PULSAR_BOTON.
Hasta aquí nada nuevo, nada que no supieramos ya.
Si hicieramos lo mismo con el TEXTFIELD1 (el de la vista 1) asignariamos la IBAction al evento de pulsar sobre el TextField, pero nosotros queremos que cuando demos a la tecla ENTER del teclado virtual este se oculte. Por defecto, Xcode, establece que cuando pulsemos sobre el TextField se muestre el teclado automaticamente, es decir, esto no hace que lo implementemos. Sin embargo, una vez mostrado, si le damos al ENTER, este no se oculta, y eso si lo tenemos que implementar. Para ello en el interface builder abrimos la venta Inpector, seleccionamos el TextField de la vista uno y pulsamos sobre la pestaña de la flechita.
Nos aparece una lista de todos los eventos a los que les podemos asignar IBAction. En este caso, el que nos sirve a nuestro proposito es Did End On Exit. Pulsamos con el ratón sobre el circulito que esta a la derecha de Did End On Exit (no hace falta tener pulsado control) y sin soltar el ratón vamos hasta nuestra App Delegate y le asignamos la IBAction PULSAR_ENTER_EN_TEXTFIELD1.
Implementación de funciones:
Como ya lo tenemos todo vinculado, es hora de implementar nuestras funciones.
4.- Cerramos interface builder y nos vamos al Archivo.m. Allí escribiremos las tres funciones:
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
[window addSubview:VISTA1];
[TEXTFIELD2 setEnabled:NO];
[window makeKeyAndVisible];
}
- (IBAction) PULSAR_ENTER_EN_TEXTFIELD1: (id) sender
{
// [VISTA1 removeFromSuperview];
// [window addSubview:VISTA1];
[TEXTFIELD1 resignFirstResponder];
}
- (IBAction) PULSAR_BOTON_F: (id) sender
{
[VISTA1 removeFromSuperview];
[window addSubview:VISTA2];
// cadena = [TEXTFIELD1 text];
[TEXTFIELD2 setText:[TEXTFIELD1 text]];
}
- (IBAction) PULSAR_BOTON_B: (id) sender
{
[VISTA2 removeFromSuperview];
[window addSubview:VISTA1];
}
Lo primero que hace nuestro programa como ya sabeis es ejecutar applicationDidFinishLaunching. Allí cargamos en la ventana la vista1 y desactivamos el TextField2 para que aunque sea pulsado no haga nada (esto lo podriamos haber hecho desde interface builder con el inspector).
La función PULSAR_BOTON2, simplemente cambia de la vista2 a la vista1. Y la función PULSAR_BOTON1. Además de cargar la de la vista1 a la vista2, cambia la propiedad Text del TEXTFIELD2, asignandole el valor que haya en ese momento en la propiedad Text del TEXTFIELD1.
Cuando ejecutamos PULSAR_ENTER_EN_TEXTFIELD1 hay dos maneras de lograr lo mismo, una es descargando y cargando la vista1, y la otra es ejecutar el método de UITextField : [TEXTFIELD1 resignFirstResponder]; que lo que hace es desactivar el teclado.
5.- Compilamos y comprobamos el funcionamiento.
Tened en cuenta que la propiedad Text de un UITextField puede ser asignada a una cadena o a un array. Como he dicho al principio, la adquisición de datos es una parte esencial de cualquier programa.
Como siempre es conveniente que investigueis con la ventana inspector del interface builder las carácteristicas que puede tener un UITextField.
Otros Artículos de la serie:
Programar para Iphone desde cero. UIButton. Nivel Tarzán.
Programa para Iphone desde uno. UIView. Nivel Piolín.
Programar para Iphone desde tres. NSMutableArray. Nivel Luis Aragonés.
Programar para Iphone desde cuatro. Controllers. Nivel Cantinflas.

Comentarios recientes
OK. thanks! sigue así! que estos tutoriales son la leche para aprender!
Si si, tambien es correcto, incluso el código queda mas claro. Yo uso id por abreviar. Y si, ya has superado el nivel consursante de gran hermano, ya que esta entre piolin y barragan. Saludos.
Bueno...otro nivel superado...creo que ya puedo decir que he alcanzado el nivel Concursante de Gran Hermano.....jajaja. Por cierto...en vez de usar siempre 'id' a la hora de declarar los objetos, también es correcto usar el tipo de objeto del que se trata, es decir, usar esto por ejemplo: IBOutlet UIView *VISTA1; en vez de: IBOutlet id VISTA1; O en los botones: IBOutlet UIButton *Boton; No?
Deja un comentario