Aprendiendo Objetive-C para IOS (Dia 7)

Guion del blog de curso de Objetive-C para IOS – DIA 7
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.
————-
Voy a completar el proyecto del ultimo día, con el método del botón cuatro, implementando el uso de una alerta para el móvil. Lo que seria el típico ALERT que sale en una pagina web, pero esta vez para iphone. Crearemos el Alert, y luego implementaremos un método para que recoja su pulsación, y haga algo con la opción elegida.

Aquí esta el código (Todo esto va en el ViewController.m):
– (IBAction)btn4_TouchUpInside:(id)sender {
    
    //Volcamos el texto original en el texto
    texto=txtOrigen.text;
    
    //Vamos a sacar una alerta en el movil, para ver como funciona.
    //Lo primero que debemos hacer, es crear un unevo objeto de alerta:
    UIAlertView *alerta=[[UIAlertView alloc] initWithTitle:@»Titulo» message:@»El mensaje que quiera» delegate:self cancelButtonTitle:@»Boton Cancelar» otherButtonTitles:@»Boton1″,@»Boton2″,@»Boton3″, nil];
    
    
    //Cambiamos el titulo de la alerta
    [alerta setTitle:[NSString stringWithFormat:@»Titulo: %@», texto]];
    
    //Con esto meto en la variable texto, el titulo del boton de indice 2 (Es Boton2)
    //nota: El boton cancelar es el indice 0
    texto=[alerta buttonTitleAtIndex:2];
    
    //Vamos a ver como podemos cambiar el color del fondo
    [alerta setBackgroundColor:[UIColor redColor]];
    
    ////////
    //Voy a rellenar botones de forma dinamica
    //Para eso me creo un array:
    NSArray *botones=[[NSArray alloc] initWithObjects:@»Zaragoza», @»Huesca», @»Teruel», nil];
    
    //Ahora lo rellenamos con un bucle
    for(int i=0; i<[botones count];i++){
        [alerta addButtonWithTitle:[botones objectAtIndex:i]];
    }
    
    //Fijaos que hay demasiados botones, es mejor no poner tantos.
    ////////
    
    
    
    //Mostramos la alerta
    [alerta show];
    
    //Liberamos recursos de memoria de la alerta
    [alerta release];
    
    //Metemos el texto en el txtDestino
    txtDestino.text=texto;
    
}
//Me creo un metodo para recoger el boton que pulse en una alerta
//Este metodo sera generico para todos los alerts
– (void) alertView: (UIAlertView *) alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
    
    //Puedo crearme un NSString para recoger el texto del boton pulsado
    NSString *titulo=[alertView buttonTitleAtIndex:buttonIndex];
    
    //Y ahora evaluar el texto que hay en el boton
    if([titulo isEqualToString:@»Boton1″]){
        txtDestino.text=@»Has pulsado el boton 1″;
    }else{
        txtDestino.text=@»Has pulsado otro boton»;
    }
    
    //O directamente podemos usar el indice del boton pulsado, para asignar el texto del boton donde queramos
    txtDestino.text=[alertView buttonTitleAtIndex:buttonIndex];
    
    //O usar un switch para que dependiendo del indice, me muestre una cosa u otra
    switch(buttonIndex){
        case 0:
            txtDestino.text=@»Has pulsado el indice 0″;
            break;
        case 1:
            txtDestino.text=@»Has pulsado el indice 1″;
            break;
        default:
            txtDestino.text=[NSString stringWithFormat:@»Otro indice %i», buttonIndex];
            break;
    }
    
}

Aprendiendo Objetive-C para IOS (Dia 6)

Guion del blog de curso de Objetive-C para IOS – DIA 6
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.
————-
Creamos un nuevo proyecto con la plantilla single-view, y nuevamente dejamos desmarcadas las 3 opciones.
Lo primero será crear el interface gráfico tal como se ve aquí:

A continuación creamos todos los Outlets y Actions, con el tipico truco de pulsar «control» y arrastrar el control a mi archivo ViewController.h Debería quedar algo asi:
Archivo ViewController.h:
———————————–
//
//  ViewController.h
//  Diario006
//
//  Created by david fraj blesa on 12/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController{
    NSString *texto;
}
//Primero las propiedades
@property (retain, nonatomic) IBOutlet UITextField *txtOrigen;
@property (retain, nonatomic) IBOutlet UITextField *txtDestino;
@property (retain, nonatomic) IBOutlet UIButton *btn1;
@property (retain, nonatomic) IBOutlet UIButton *btn2;
@property (retain, nonatomic) IBOutlet UIButton *btn3;
@property (retain, nonatomic) IBOutlet UIButton *btn4;
//Ahora los diferentes metodos
– (IBAction)btn1_TouchUpInside:(id)sender;
– (IBAction)btn2_TouchUpInside:(id)sender;
– (IBAction)btn3_TouchUpInside:(id)sender;
– (IBAction)btn4_TouchUpInside:(id)sender;
@end
———————-
En el siguiente archivo, esta la implementación de los 4 métodos que hemos creado. Cada botón responde a uno de los métodos, haciendo diferentes funciones. Fijaos en el código mas abajo para poder ver que hacen cada uno.
El primero, es un repaso a los diferentes métodos, que tiene el objeto NSString
El Segundo es un ejemplo, de como usar esos métodos, para averiguar la letra correspondiente a un DNI
El Tercero es un ejemplo de como implementar el algoritmo de cifrado CESAR
El cuarto se queda sin implementar de momento
Archivo ViewController.m:
———————————–
//
//  ViewController.m
//  Diario006
//
//  Created by david fraj blesa on 12/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «ViewController.h»
@implementation ViewController
@synthesize txtOrigen;
@synthesize txtDestino;
@synthesize btn1;
@synthesize btn2;
@synthesize btn3;
@synthesize btn4;
– (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 setTxtOrigen:nil];
    [self setTxtDestino:nil];
    [self setBtn1:nil];
    [self setBtn2:nil];
    [self setBtn3:nil];
    [self setBtn4: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 {
    [txtOrigen release];
    [txtDestino release];
    [btn1 release];
    [btn2 release];
    [btn3 release];
    [btn4 release];
    [super dealloc];
}
– (IBAction)btn1_TouchUpInside:(id)sender {
    
    //Asignamos el texto que hemos escrito, a nuestra variable «texto»
    texto=txtOrigen.text;
    
    //Vamos a jugar con el NSString
    //nota: Si no ponemos delante texto=
    //no hara nada, porque no asigna nada
    //Buscamos la palabra «hola», y la sustituimos por la palabra «adios»
    [texto stringByReplacingOccurrencesOfString:@»hola» withString:@»adios»];
    
    //Longitud de la cadena de texto
    [NSString stringWithFormat:@»%i»,[texto length]];
    
    //Cadena de texto en mayusculas
    [texto uppercaseString];
    
    //Cadena de texto en minusculas
    [texto lowercaseString];
    
    //Accedemos al primer caracter:
    [texto substringWithRange:NSMakeRange(0,1)];
    
    //Sustituimos el primer caracter por una x
    [texto stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:@»x»];
    
    //Vamos a hacer un bucle para sustituir todas las letras «a» en minusculas, por «A» mayusculas
    //Creamos una variable para almacenar el caracter actual
    NSString *caracter;
    
    //Creamos un bucle que recorrera desde el caracter numero 0, hasta el ultimo caracter, ultilizando el metodo length del objeto NSString
    for(int i=0;i<[texto length]-1;i++){
        //Extraemos el caracter actual
        caracter=[texto substringWithRange:NSMakeRange(i,1)];
        
        //Si el caracter es una «a», la sustituimos por «A» mayuscula
        if([caracter isEqualToString:@»a»]){
            texto=[texto stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:@»A»];
        }
    }
    //Fin del bucle
    
    
    
    
    
    //Volcamos el texto al destino
    txtDestino.text=texto;
    
}
– (IBAction)btn2_TouchUpInside:(id)sender {
    
    //Esto es el uso del algoritmo necesario para calcular la letra del dni
    //Creamos una primera variable con todas las letras
    NSString *letras=@»TRWAGMYFPDXBNJZSQVHLCKE»;
    
    //Recogemos el numero que habra en el texto original
    int numero=[txtOrigen.text integerValue];
    
    //Saco informacion del numero
    NSLog(@»%i», numero);
    
    //Vamos a calcular la posicion del vector donde esta la letra
    //Para esto creamos una nueva variable
    int posicion=0;
    
    //Se hace la operacion modulo 23, del numero de carnet de DNI, y asi sabemos la posicion del
    //vector de letras, que corresponde a ese dni
    posicion=numero%23;
    
    //Saco informacion de la posicion
    NSLog(@»%i», posicion);
    
    //escribo en el cuadro de texto de destino, la letra.
    txtDestino.text=[NSString stringWithFormat:@»La letra es %@», [letras substringWithRange:NSMakeRange(posicion,1)]];
    
}
– (IBAction)btn3_TouchUpInside:(id)sender {
    
    //Vamos a implementar el algoritmo CESAR
    //Empezamos creando lo que seria el vector de letras
    NSMutableArray *letrasOriginales=[[NSMutableArray alloc] initWithObjects:@»a», @»b», @»c», @»d», @»e», @»f», @»g», @»h» ,@»i», @»j», @»k», @»l», @»m», @»n», @»ñ», @»o», @»p», @»q», @»r», @»s», @»t», @»u», @»v», @»w», @»x», @»y», @»z», nil];
    NSMutableArray *letrasCifradas=[[NSMutableArray alloc] initWithObjects:@»a», @»b», @»c», @»d», @»e», @»f», @»g», @»h» ,@»i», @»j», @»k», @»l», @»m», @»n», @»ñ», @»o», @»p», @»q», @»r», @»s», @»t», @»u», @»v», @»w», @»x», @»y», @»z», nil];
    
    //Empezamos con una clave por defecto de 3 (Asi es como cesar cifraba sus mensajes)
    int clave=6;
    
    //Vamos a rehacer el vector de letras Cifradas, usando la clave que hemos puesto
    //Bucle para eso
    int posicion;
    for(int i=0;i<[letrasOriginales count];i++){
        //Calculamos la posicion adecuada a sustituir, segun la clave
        posicion=(i+clave)%27;
        [letrasCifradas replaceObjectAtIndex:i withObject:[letrasOriginales objectAtIndex:posicion]];
        
    }
    
    //Mostramos el nuevo vector 
    for(int i=0; i<[letrasCifradas count];i++){
        NSLog(@»%@ corresponde a %@», [letrasOriginales objectAtIndex:i], [letrasCifradas objectAtIndex:i]);
    }
    
    //Vamos a cifrar ahora con el nuevo vector creado.
    //Lo que haremos para no tener problemas, es que el vector cifrado estara en mayusculas, y el vector original en minusculas. Asi no tendremos ningun problema.
    
    //Hacemos un bucle para pasar todas las letras a mayusculas:
    for(int i=0; i<[letrasCifradas count];i++){
        [letrasCifradas replaceObjectAtIndex:i withObject:[[letrasCifradas objectAtIndex:i] uppercaseString]];
    }
    //jur jur jur: madre mia con la sintaxis en objetive-c!!!
    
    //Ahora vamos a cifrar el texto
    //Volcamos el texto original a la variable «texto»
    texto=txtOrigen.text;
    
    //Hacemos un bucle, para recorrer letra por letra el texto original
    for(int i=0; i<[texto length]-1;i++){
        //cada vez que estemos en una letra, hay que sustituirla por su correspondiente en el vector de letras. Asi que lo voy a hacer a las bravas, y recorrere con un bucle cada vector:
        for(int j=0;j<[letrasOriginales count];j++){
            if([[texto substringWithRange:NSMakeRange(i,1)] isEqualToString:[letrasOriginales objectAtIndex:j]]){
                texto=[texto stringByReplacingCharactersInRange:NSMakeRange(i, 1) withString:[letrasCifradas objectAtIndex:j]];
            }
        }
    }
    
    //Por ultimo volcamos el texto, en el txtDestino
    txtDestino.text=texto;
    
}
– (IBAction)btn4_TouchUpInside:(id)sender {
    
    //Este metodo queda de momento pendiente
    
}
@end

Aprendiendo Objetive-C para IOS (Dia 5)

Guion del blog de curso de Objetive-C para IOS – DIA 5
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 como podemos crearnos una subclase, que herede todo de un UIButton. De esa forma, tendremos toda la potencia del UIButton, mas a parte podremos añadirle propiedades para poder trabajar con una clase nueva. La clase se va a llamar Celda, y queremos establecerle una serie de propiedades, así como sobreescribir el constructor, para poder iniciar la la Celda con las imágenes de estado que nosotros queramos.

Para esto, nos creamos una nueva clase, desde Boton derecho en nuestro nombre de proyecto, New File -> y elegimos Objetive-C Class

Cuando aparezca la pantalla, llamamos a nuestra Clase «Celda», y le decimos que derive de la clase «UIButton» (Si no aparece en el listado, la escribimos.

Nos creara dos ficheros, uno Celda.h y otro Celda.m
Celda.h quedara asi:
—————————–
//
//  Celda.h
//  Diario004
//
//  Created by david fraj blesa on 10/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface Celda : UIButton{
//Creamos tres nuevas variables, una para el valor, otra para saber si
//esta o no pulsado, y un objeto de tipo NSString, para guardar el
// nombre de esa celda
    NSString *nombre;
    int valor;
    int pulsado;
}
//Creamos las propiedades correspondientes al objeto celda
@property (nonatomic, copy) NSString *nombre;
@property (nonatomic) int valor;
@property (nonatomic) int pulsado;
@end
Celda.m quedara asi:
—————————–
//
//  Celda.m
//  Diario004
//
//  Created by david fraj blesa on 10/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «Celda.h»
@implementation Celda{
    
}
//Con esto creamos los métodos jet y set, para todas las propiedades
@synthesize  nombre, valor, pulsado;
//Con esto sobreescribimos el método constructor, para que al instanciar el objeto
//Se le asigne la imagen de estado normal, y la imagen de estado pulsado
//El método devuelve un objeto genérico (id), y recibe una variable de tipo (CGRect)
// llamada frame
– (id)initWithFrame:(CGRect)frame 
{
    if (self = [super initWithFrame:frame]) 
    {
        [self setImage:[UIImage imageNamed:@»defaultflash.gif»] forState:UIControlStateNormal];
        [self setImage:[UIImage imageNamed:@»pulsado.gif»] forState:UIControlStateHighlighted];
        self.adjustsImageWhenHighlighted = YES;
    }
    return self;
}
@end
—————————–
—————————–
Vamos a usar este nuevo objeto que acabamos de crear.
nota: Las imágenes que he empleado, son imágenes gif cogidas de google de 50×50
Para añadirlas a mi proyecto, lo único que tengo que hacer, es darle a añadir archivos (Add Files to ….), y elegir las imágenes. Aseguraos que esta marcada la casilla «Copy Items…» para que os haga una copia de la misma.
Para usar nuestra nueva clase en el ViewController.m, debemos añadir la linea 
#import «Celda.h» a nuestro fichero ViewController.m
Vamos pues al archivo ViewController.m, que debería tener este método así:
– (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    
    //Inicializo el numero a 0
    int numero=0;
    int posicionInicialX=5;
    int posicionInicialY=5;
    int fila=0;
    int modulo=0;
    //Vamos a crear un bucle para crear dinamicamente 40 botones
    for(int i=0; i<48; i++){
        //PASO 1: Declaramos el objeto, reservamos memoria, y lo inicializamos
        Celda *boton=[[Celda alloc] init];
        
        //Le damos valores a las variables del objeto celda
        boton.nombre=[NSString stringWithFormat:@»Carta %d», numero];
        [boton setValor:numero*10];
        [boton setPulsado:0];
        //boton.buttonType=UIButtonTypeRoundedRect;
        
        //PASO 2: Vamos a darle un titulo al boton, que sera la variable numero incrementada en uno cada vez que se     pulse
        NSString *titulo=[NSString stringWithFormat:@»%d», numero++];
        [boton setTitle:titulo forState:UIControlStateNormal];
        
        //PASO 3: Vamos a agregarle un evento, que al hacer click, ejecute el mismo metodo en el que estamos, aunque podria 
        //ser otro evento perfectamente.
        [boton addTarget:self action:@selector(pulsar:) forControlEvents:UIControlEventTouchUpInside];
        
        //Establecemos una posicion meciante un CGRect, hay que calcular la posicion correcta, segun el numero de elmentos
        
        //Hacemos la operacion modulo, para saber donde estamos
        modulo=i%8;
        if(modulo==0){
            fila++;            
        }
        
        CGRect botonFrame = CGRectMake(posicionInicialX+modulo*39, posicionInicialY+fila*39, 39, 39 );
        [boton setFrame:botonFrame];
        
        //Añadimos dicho boton a la vista en la que estamos
        [self.view addSubview:boton];
    }
    
}
————————
Nos falta implementar el metodo «pulsar»
————————
– (void)pulsar:(Celda *)sender{
    //Metodo al pulsar cualquiera de los botones
    NSString *cadena=[[NSString alloc] initWithFormat:@»Celda %i», ((Celda *) sender).valor];
    //NSString *cadena=[[NSString alloc] initWithFormat:@»Celda %i», [sender pulsado]];
    NSLog(@»Has pulsado el %@», cadena); //OK*/
    
    //Averiguamos si lo pulsamos o no, y le cambiamos el color
    if(((Celda *) sender).pulsado==0){
        ((Celda *) sender).pulsado=1;
        ((Celda *) sender).backgroundColor=[UIColor yellowColor];
        //Vamos a cambiar ahora la imagen en tiempo de ejecucion, al pulsar un boton.
        [sender setImage:[UIImage imageNamed:@»msnicon.gif»] forState:UIControlStateNormal];
    }else{
        ((Celda *) sender).pulsado=0;
        ((Celda *) sender).backgroundColor=[UIColor blueColor];
        //Vamos a cambiar ahora la imagen en tiempo de ejecucion, al pulsar un boton.
        [sender setImage:[UIImage imageNamed:@»defaultflash.gif»] forState:UIControlStateNormal];
    }
    
    
}
————————

De esta manera, como vemos en la imagen, ya tenemos generado de forma dinámica una matriz de celdas, que responden dinámicamente a la pulsación, y cambian de estado según se van pulsado.

Aprendiendo Objetive-C para IOS (Dia 4)

Guion del blog de curso de Objetive-C para IOS – DIA 4
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 como podemos crear ahora botones, en tiempo de ejecicion. En este ejemplo, voy a ver como crear un botón, nada mas cargar la aplicación. De manera que para eso, lo único que hay que hacer, es ir al método
(void)viewDidLoad del archivo ViewController.m, y escribir el siguiente código, quedando el método de esta manera:

– (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    ///////////////////////////////////////////////////////////////////////
    //Voy a crear un boton en tiempo de ejecucion
    //PASO 1: Declaramos el objeto, reservamos memoria, y lo inicializamos
    UIButton *boton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    //PASO 2: Vamos a darle un titulo al boton, que sera la variable numero incrementada en uno cada vez que se pulse
    NSString *titulo=[NSString stringWithFormat:@»Boton numero 1″];
    [boton setTitle:titulo forState:UIControlStateNormal];
    
    //PASO 3: Vamos a agregarle un evento, que al hacer click, ejecute el evento que sea
    //ser otro evento perfectamente.
    [boton addTarget:self action:@selector(pulsame:) forControlEvents:UIControlEventTouchUpInside];
    
    //Establecemos una posicion meciante un CGRect, 
    CGRect botonFrame = CGRectMake(5, 5, 10, 37 );
    [boton setFrame:botonFrame];
    
    //Añadimos dicho boton a la vista en la que estamos
    [self.view addSubview:boton];
    
    ////////////////////////////////////////////////////////////////////////
}
Con esto, nada mas cargar la aplicación, estamos creando un nuevo botón. Solo faltaría, crear el método al que responderá la pulsación del botón, que hemos llamado pulsame. Podria quedar de esta forma:
– (void)pulsame:(Celda *)sender{
//Creamos un objeto llamado cadena, para recoger el nombre del objeto boton
    NSString *cadena=[[NSString alloc] initWithFormat:@»%@», (UIButton *)[sender titleForState:UIControlStateNormal]];
//Lo mostramos con NSLog
    NSLog(@»Has pulsado el %@», cadena); 
    
}
Aunque parezca complicado, lo único que hacemos es, hacer un castro del objeto sendero, diciendo, que se trata de un UIButton, de manera que apartir de ahora, podemos llamarle y recoger valores del mismo botón, o directamente modificar dichos valores, tal como estamos haciendo, con el método titleForState
Acordaos que para ver lo que pasa en consola, podemos scar la consola con COMMANDO+MAY+C
—————————
Sabiendo esto, podríamos ahora coger, y crearnos algo un poco mas complejo, como por ejemplo, crearnos 40 botones de golpe, dejando alguna linea de separación cada 8 botones por ejemplo. Esto lo haremos también. Lo podemos hacer también en el método viewDidLoad, quedando así de esta forma:
– (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    
    //Inicializo el numero de cartas a 0
int numeroCartas;
    numeroCartas=0;
    
    int posicionInicialX=5;
    int posicionInicialY=5;
    int fila=0;
    int modulo=0;
    //Vamos a crear un bucle para crear dinamicamente 40 botones
    for(int i=0; i<48; i++){
    
        /*//Esto para UIButton:
        //PASO 1: Declaramos el objeto, reservamos memoria, y lo inicializamos
        UIButton *boton=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    
        //PASO 2: Vamos a darle un titulo al boton, que sera la variable numero incrementada en uno cada vez que se     pulse
        NSString *titulo=[NSString stringWithFormat:@»%d», numeroCartas++];
        [boton setTitle:titulo forState:UIControlStateNormal];
    
        //PASO 3: Vamos a agregarle un evento, que al hacer click, ejecute el mismo metodo en el que estamos, aunque podria 
        //ser otro evento perfectamente.
        [boton addTarget:self action:@selector(pulsame:) forControlEvents:UIControlEventTouchUpInside];
    
        //Establecemos una posicion meciante un CGRect, hay que calcular la posicion correcta, segun el numero de elmentos
        
        //Hacemos la operacion modulo, para saber donde estamos
        modulo=i%8;
        if(modulo==0){
            fila++;            
        }
        
        CGRect botonFrame = CGRectMake(posicionInicialX+modulo*39, posicionInicialY+fila*39, 39, 39 );
        [boton setFrame:botonFrame];
    
        //Hacemos una prueba, y mostramos por consola el titulo de l boton
        //NSLog(@»Has pulsado el %@», [boton titleForState:UIControlStateNormal]);
        
        //Añadimos dicho boton a la vista en la que estamos
        [self.view addSubview:boton];*/
        
        //////////////
}
}
Podemos utilizar el mismo código del método «pulsame» que hemos creado antes, para ver como efectivamente, el mismo método vale para todos los botones generados dinámicamente.

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]];
    
}

Aprendiendo Objetive-C para ios (Dia 2)

Guion del blog de curso de Objetive-C para IOS – DIA 2
————-
En esta parte, voy a repasar el tema de las sentencias de control, asi como el uso de Array y MutableArray, y vamos a crear un objeto nuevo, para repasar asi como se establecen en objetive-c las propiedades de un objeto.

————
Seguimos en el viewDidLoad de ViewControler.m
Vamos a ver sentencias de control, así como objetos
————————-
Crearemos también un objeto, llamado originalmente «Objeto», de manera que tendremos dos ficheros nuevos, Objeto.m y Objeto.h
Esto quedaran así:
————————–
//
//  Objeto.h
//  diario002
//
//  Created by david fraj blesa on 09/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Objeto : NSObject{
    //Creamos Variable dentro de nuestro objeto
    NSString *nombre;
    NSString *apellidos;
    NSString *telefono;
    int edad;
    NSDate *fecha;
    NSNumber *precio;
}
//Creamos sus propiedades (Getter y Setters)
//Esto sirve para saber como vamos a dar o devolver valores.
@property (nonatomic, copy) NSString *nombre;
@property (nonatomic, copy) NSString *apellidos;
@property (nonatomic, copy) NSString *telefono;
@property (nonatomic, copy) NSDate *fecha;
@property (nonatomic, copy) NSNumber *precio;
//Las propiedades de edad, las ponemos a mano
-(int) edad;
-(void) setedad:(int)x;
@end
————————–
//
//  Objeto.m
//  diario001
//
//  Created by david fraj blesa on 09/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «Objeto.h»
@implementation Objeto
//Directamente con esto, creamos los getter y setters de cada uno.
@synthesize nombre, apellidos, telefono, fecha, precio;
//Si quisieramos hacerlo a mano, podria quedar asi:
//Establecemos la propiedad a mano de edad:
-(int)edad{
    return edad;
}
-(void)setedad:(int)x{
    edad=x;
}
@end
————————-
– (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    /*EMPIEZA EL CODIGO POR DAVID FRAJ BLESA*/
    //Vamos alla con las estructuras de control:
    //Estructura de control condicional:
    NSInteger num=10;
    if(num>10){
        NSLog(@»El numero es mayor»);
    }else{
        NSLog(@»El numero no es mayor»);
    }
    
    //Estructura de control de tipo while
    num=0;
    while(num<10){
        NSLog(@»El numero es %i», num);
        num++;
    }
    
    //Estructura de control de tipo for:
    for(num=0;num<10;num++){
        NSLog(@»El numero es %i», num);
    }
    
    //Vamos a ver como usar un vector de numeros
    //Declaramos un array ESTATICO, y lo inicializamos directamente con varios NSStrings
    //Para eso hemos reservado memoria, y lo hemos inicializado con initWithObjects.
    //El primer indice, sera el 1
    //Es obligatorio, que el ultimo elemento sea nil, para que xcode se entere que no queremos
    //meter mas elementos.
    NSArray *vector=[[NSArray alloc] initWithObjects:@»uno», @»dos», @»tres», nil];
    
    //Creamos un bucle for, para recorrer el vector, y mostrar los elementos, segun
    //su indice introducido.
    for(int i=0;i<[vector count];i++){
        NSLog(@»La cadena es: %@», [vector objectAtIndex:i]);
    }
    
    //CON NSArray, NO podemos añadir mas objetos. Para eso usamos NSMutableArray
    
    //Creamos un vector Mutable:
    NSMutableArray *vector2=[[NSMutableArray alloc] initWithObjects:@»uno», @»dos», @»tres», nil];
    
    //Hasta ahora es igual, pero ahora vamos a añadir nuevos elementos de forma dinamica
    [vector2 addObject:@»cuatro»];
    [vector2 addObject:@»cinco»];
    
    //De igual forma podemos quitar elementos
    [vector2 removeObjectAtIndex:3];
    
    //o podemos insertar elementos en una posicion concreta
    [vector2 insertObject:@»cero» atIndex:0];
    
    //mostramos el vector 2:
    NSLog(@»Mostramos vector2:»);
    NSLog(@»——————«);
    for(int i=0;i<[vector2 count];i++){
        NSLog(@»La cadena es: %@», [vector2 objectAtIndex:i]);
    }
    
    //Ahora voy a crearme un objeto , que derivara de NSObject (Como casi todo aqui)
    //Para eso, me voy al new file -> Elijo objetive-c class -> Le pongo de nombre
    // Objeto, y creara el archivo Objeto.m y Objeto.h
    
    //Para usar dicho objeto:
    //nota: arriba importamos el objeto con una linea, quedando asi:
    //Debajo de: #import «ViewController.h»
    //Escribimos esto: #import «Objeto.h»
    
    //Creamos un objeto
    Objeto *david=[[Objeto alloc] init];
    
    //Dos formas de poner un string
    [david setNombre:@»David»];
    david.nombre=@»David»;
    
    [david setApellidos:@»Fraj Blesa»];
    [david setTelefono:@»555123456″];
    
    [david setedad:34];
    
    //Para la fecha vamos a crear una fecha, que guarde la de ahora mismo
    NSDate *ahora=[[NSDate alloc] init];
    
    [david setFecha:ahora];
    
    //Vamos a escribir por pantalla informacion guardada en el objeto.
    
    NSLog(@»Los datos: %@, %@, %@, %i», [david nombre], [david apellidos], david.telefono, [david edad]);
    
    /*Fin del CODIGO POR DAVID FRAJ BLESA*/
}
Eso es todo por ahora!!!!!!

Aprendiendo Objetive-C para ios (Dia 1)

Voy a continuar con el aprendizaje de programacion de objetive-c para ios, y que mejor que realizar un diario de todo lo que voy a ir aprendiendo y poniendo en practica.

Empezaremos viendo los conceptos funcamentales que todo el mundo debe tener en cuenta para programar en un lenguaje de programacion.

Guion del blog de curso de Objetive-C para IOS – DIA 1
————-
Creamos un nuevo proyecto para ver como va el tema:

Abrimos XCODE
Nuevo Proyecto
Single View Aplicacion
Le ponemos un nombre, y no marcamos ni storyboard, ni ARC
Device Family: iphone
Vamos a crear nuestro primer programa. Para eso, vamos a hacer el típico «HOLA MUNDO».
Vamos al archivo donde empieza la aplicación, que es el ViewController.m
Buscamos el método viewDidLoad, y lo dejamos con el siguiente aspecto:
– (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //Creamos nuestro mensage Hola mundo en la consola
    NSLog(@»Hola mundo en la consola»);
    
    
}
Ejecutamos el programa, y aparecerá el emulador de iphone con una pantalla en blanco. Debemos activar la consola, para poder ver los resultados que estamos sacando, mediante NSlog. Para eso:
Menu View -> Debug Area -> Activate console (O teclas MAY+COMMANDO+C)
Vemos los resultados -> OK!!!
Vamos a trabajar ahora con diferentes variables.
Seguiremos poniendo todo el código, dentro del método viewDidLoad, tal como hemos puesto el NSLog, ya que vamos a ver como podemos ir jugando con los diferentes tipos de datos que tenemos.
El código queda así:
– (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    /*EMPIEZA EL CODIGO POR DAVID FRAJ BLESA*/
    
    //Creamos nuestro mensage Hola mundo en la consola
    NSLog(@»Hola mundo en la consola»);
    
    NSLog(@»Esto es un mensaje que mostraremos tambien en la consola.»);
    
    
    //Creamos un objeto de tipo NSString, para manejar cadenas de caracteres.
    //Se pone el *, ya que cadena va a ser un objeto, y lo que creamos realmente es un puntero, que guardara la direccion de memoria de ese objeto.
    //Con alloc, reservamos memoria
    //init, es el metodo para construir realmente el objeto. Tiene muchos constructores.
    NSString *cadena=[[NSString alloc] init];
    
    //Le damos un valor a la cadena de esta forma
    cadena=@»Hola que tal desde una variable»;
    
    //NSlog, es un metodo, que sirve para sacar cosas por pantalla. Como queremos sacar el valor de una cadena de texto, tenemos que indicarselo con %@, dentro de las comillas, y a continuacion, ponerle la variable que realmente contine el valor.
    NSLog(@»%@», cadena);
    //Vamos a crear otro objeto:
    NSString *cadena2=[[NSString alloc] initWithString:@»Hola que tal desde 2″];
    
    //La mostramos con NSLog
    NSLog(@»%@, y otra %@», cadena, cadena2);
    
    //Vamos a crear varios enteros, y operaremos con ellos.
    //nota: no ponemos un *, porque NO son punteros, asi que no hay que reservar memoria con alloc, ni inicializarlos con un constructor de tipo init.
    //Forma 1:
    int num0;
    num0=1;
    
    //Forma 2:
    NSInteger num1, num2, num3;
    num1=10;
    num2=12;
    num3=num0+num1+num2;
    
    //Mostramos resultados por pantalla
    NSLog(@»El valor de numero es %i», num3);
    
    
    //Creamos una variable de tipo double.
    //Forma1:
    double num4;
    num4=12.23;
    
    /*tipos standard de datos:*/
    //1 byte;
    char caracter;
    caracter=‘a’;
    
    //4 bytes;
    int entero;
    entero=10;
    
    //4 bytes;
    float flotante;
    flotante=12.89;
    
    /*Tipos derivados de datos*/
    short corto; //2 bytes;
    corto=10;
    
    long largo; //4 bytes
    largo=15722;
    
    long long largolargo; //8 bytes;
    largolargo=5214215;
    
    double doble; //8 bytes;
    doble=2120191.898212;
    
    /*Otros tipos de datos*/
    BOOL booleano;
    booleano=true;
    
    NSLog(@»Mostramos datos: boolenao:%i, doble: %f, caracter: %c,», booleano, doble, caracter);
    
    //Podemos realizar cualquier operacion, y luego meterla dentro de NSLog para mostrar los resultados por la consola.
    
    //Creamos un NSNumber, que es el objeto que existe para poder crear cualquier numero, y utilizar asi un sin fin de operaciones diferentes.
    
    //Lo creamos, y le damos el valor inicial de un float
    NSNumber *numero=[[NSNumber alloc] initWithDouble:doble];
    
    //Lo mostramos en un NSlog, usando el metodo de la variable numero llamado doubleValue, que devuelve el valor double de numero.
    NSLog(@»El valor de numero es %f», [numero doubleValue]);
    
    
    
    /*Fin del CODIGO POR DAVID FRAJ BLESA*/
}
Aquí terminamos de momento por ahora. Hemos repasado el tema de variables, como mostrar contenido en consola, etc etc.
El proximo dia mas!!
Un saludo a todos!.