domingo, 10 de junio de 2012

Aprendiendo Objetive-C para IOS (Dia 3)


Guion del blog de curso de Objetive-C para IOS - DIA 3

nota: Esto es no es curso propiamente dicho, es un diario de autoaprendizaje de objetive-c, que me sirve para afianzar conocimientos, y de paso, tener un diario de referencia, con ejemplos propios de uso del lenguaje.
-------------

Vamos a ver los controles estándar que se pueden usar dentro de xcode, así como repasar el concepto de modelo vista controlador, que vamos a usar para crear aplicaciones en esta plataforma.

De momento, no usamos Storyboard, con lo que usaremos ficheros .xib para generar el interface de pantalla, y luego lo uniremos con el resto de programa.





Creamos un nuevo proyecto, y dejamos desmarcado Storyboard, y ARC. El proyecto será single-view controller.

Una vez creados los ficheros iniciales, vemos un fichero ViewController.xib, que contiene el interface gráfico de la primera vista de la aplicación. Hacemos doble click en el, y vemos como aparece el interface. A la derecha, deberían aparecer los diferentes controles disponibles del framework.

Dentro de la libreria de objetos de Cocoa Touch, podemos pinchar en el apartado controls, y veremos aqui los diferentes controles que podemos insertar en nuestra vista, tales como botones, etiquetas, campos de texto, etc.

Para insertar controles, lo único que tenemos que hacer es arrastrar los controles  a nuestra vista.



Hasta aquí es lo fácil.

Ahora tenemos que conectar los controles, y sus eventos con nuestro código. En otros entornos, tales como Visual Basic .net, o visual c#, esto es automático, pero aquí no, aunque con la ultima versión de xcode, se agiliza mucho el proceso.

Arrastramos varios controles a nuestro VIEW,  Uno de cada, así de esta manera, vamos a poder ver un ejemplo claro.

Una vez que tenemos los controles, tenemos que crear lo outlets, es decir, tenemos que crearnos las variables necesarias dentro de nuestro viewController, para poder acceder a dichos objetos. Para esto, lo único que tenemos que hacer, es pulsando la tecla de control, pinchar en el control de la vista, y arrastrado al archivo ViewController.h, justo debajo del comienzo de declaración de @interface

Nos pedirá que le digamos el nombre del objeto en el código. Yo los voy a llamar a todos con el prefijo dav, y luego el nombre del propio control. Quedando así:

-------------------
//
//  ViewController.h
//  Diario003
//
//  Created by david fraj blesa on 09/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (retain, nonatomic) IBOutlet UILabel *davUILabel;
@property (retain, nonatomic) IBOutlet UIButton *davUIButton;
@property (retain, nonatomic) IBOutlet UISegmentedControl *davUISegmentedControl;
@property (retain, nonatomic) IBOutlet UITextField *davUITextField;
@property (retain, nonatomic) IBOutlet UISlider *davUISlider;
@property (retain, nonatomic) IBOutlet UIActivityIndicatorView *davUIActivityIndicatorView;
@property (retain, nonatomic) IBOutlet UIProgressView *davUIProgressView;
@property (retain, nonatomic) IBOutlet UIPageControl *davUIPageControl;
@property (retain, nonatomic) IBOutlet UIStepper *davUIStepper;

@end

-------------------

//
//  ViewController.m
//  Diario003
//
//  Created by david fraj blesa on 09/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "ViewController.h"

@implementation ViewController
@synthesize davUILabel;
@synthesize davUIButton;
@synthesize davUISegmentedControl;
@synthesize davUITextField;
@synthesize davUISlider;
@synthesize davUIActivityIndicatorView;
@synthesize davUIProgressView;
@synthesize davUIPageControl;
@synthesize davUIStepper;


- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    
    
}

- (void)viewDidUnload
{

    [self setDavUILabel:nil];
    [self setDavUIButton:nil];
    [self setDavUISegmentedControl:nil];
    [self setDavUITextField:nil];
    [self setDavUISlider:nil];
    [self setDavUIActivityIndicatorView:nil];
    [self setDavUIProgressView:nil];
    [self setDavUIPageControl:nil];
    [self setDavUIStepper:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

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

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)dealloc {

    [davUILabel release];
    [davUIButton release];
    [davUISegmentedControl release];
    [davUITextField release];
    [davUISlider release];
    [davUIActivityIndicatorView release];
    [davUIProgressView release];
    [davUIPageControl release];
    [davUIStepper release];
    [super dealloc];
}

@end


-------------------

Si nos fijamos, xcode ha creado las propiedades por nosotros, y ha creado el synthesize para cada uno de los controles, así como cuando se descarga la VIEW, todos se ponen a nil (NULL), y se hace el vaciado de memoria en el método dealloc del ViewController, liberando los recursos necesarios para todos.

De esta forma, ya podríamos acceder a todos y cada uno de los controles desde código.


En el archivo ViewController.h, podríamos poner esto en el método viewDidLoad:

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    
    //Ponemos un texto en el Label
    [davUILabel setText:@"Hola que tal"];
    
    //Ponemos un texto en el boton
    [davUIButton setTitle:@"Hola" forState:UIControlStateNormal];
    
    //Cambiamos el color del texto del boton
    UIColor *color=[[UIColor alloc] initWithRed:0.5 green:0.5 blue:0.5 alpha:1];
    [davUIButton setTitleColor:color forState:UIControlStateNormal];
    [color release];
    
    //Cambiamos el color de fondo del boton
    UIColor *color2=[[UIColor alloc] initWithRed:0.2 green:0.1 blue:0.3 alpha:1];
    [davUIButton setBackgroundColor:color2];
    [color2 release];
    
    //Cambiamos el color de fondo del TextField, pero esta vez, sin crearnos directamente una variable, usando los metodos de clase, en vez de instancia.
    davUITextField.backgroundColor=[UIColor colorWithRed:0.6 green:0.7 blue:0.9 alpha:1];
    
    
}

----------------
----------------

Hasta aquí todo correcto, pero de momento, al pulsar botones, deslizar sliders, etc, no pasa nada, ya que de momento no hemos conectado los eventos de los botones con nuestro código, y no hemos creado los métodos adecuados. PAra hacer esto, necesitamos crearnos los métodos necesarios. Para esto, vamos a nuestro xib, y volvemos a arrastrar manteniendo pulsado la tecla de control el botón, a nuestro archivo ViewController.h, justo debajo de todas las propiedades que hemos creado.



Quedara esta linea así:

//Esto en el archivo ViewCOntroller.h
- (IBAction)davUIButton_TouchUpInside:(id)sender;

//Esto en el archivo ViewCOntroller.m
- (IBAction)davUIButton_TouchUpInside:(id)sender {
}

----------

El nombre "davUIButton_TouchUpInside", lo he elegido así, ya que veo lógico que el método se llame como el botón mas un guión bajo, mas el nombre del evento al que va a responder el método. Esto es una practica que deberíamos coger como habitual, sino, tendremos un montón de métodos en nuestro código, y al final será muy complicado encontrar todo.

-----------

Vamos a poner un código, que genere un numero aleatorio, y lo ponga en el label:

Esto lo pondremos en el archivo ViewController.m

- (IBAction)davUIButton_TouchUpInside:(id)sender {
    
    //Al pulsar el boton, vamos a crear un numero aleatorio, y lo pondremos en el el text del Label.
//Numero entre 1 y 10
    int numero= (rand() %10) + 1;
    [davUILabel setText:[[NSString alloc] initWithFormat:@"%i", numero]];
    
}

No hay comentarios:

Publicar un comentario