Aprendiendo Objetive-C para IOS (Dia 9)

Guion del blog de curso de Objetive-C para IOS – DIA 9
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 se puede utilizar un NSTimer, para realizar diferentes acciones. Por ejemplo, el crear un contador, o el mover un objeto por la pantalla.

Creamos un nuevo proyecto, de tipo single-view, sin usar storyboard, ni ARC.
Creamos un interface como se ve a continuación, con dos imágenes, 3 labels y un Stepper

Creamos todos los outlets de los componentes, y un catión del stepper, para que se actualice el label adecuado cada vez que incrementamos o decrementos su valor.
Teneis como siempre la explicación, en los comentarios de los archivos
Los archivos quedaran así:
//
//  ViewController.h
//  Diario009
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController{
    //Esto sera una variable de tipo entero, para controlar el tiempo
    int contador;
    int contador2;
    NSTimer *eltimer;
    NSTimer *eltimer2;
    
}
@property (retain, nonatomic) IBOutlet UILabel *lblTiempo;
@property (retain, nonatomic) IBOutlet UILabel *lblTiempo2;
@property (retain, nonatomic) IBOutlet UIImageView *imgBola;
@property (retain, nonatomic) IBOutlet UIImageView *imgBola2;
@property (retain, nonatomic) IBOutlet UIStepper *spMasMenos;
@property (retain, nonatomic) IBOutlet UILabel *lblNumero;
– (IBAction)spMasMenos_valueChanged:(id)sender;
-(void) metodo;
-(void) metodo2;
@end
——————–
——————–
//
//  ViewController.m
//  Diario009
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «ViewController.h»
@implementation ViewController
@synthesize lblTiempo;
@synthesize lblTiempo2;
@synthesize imgBola;
@synthesize imgBola2;
@synthesize spMasMenos;
@synthesize lblNumero;
– (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren’t in use.
    
}
#pragma mark – View lifecycle
– (void)viewDidLoad
{
    //Ponemos el contador a 0
    contador=0;
    contador2=0;
    
    //Inicializamos el timer
    //El NSTimer, funciona de tal manera que al reservar memoria para dicho timer
    //Tenemos que decirle el intervalo de tiempo, el objetivo o target de
    //Dicho timer, el «metodo» que se ejecutara cada vez, y el numero de
    //veces que se va a repetir
    eltimer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(metodo) userInfo:nil repeats:YES];
    
    //Creamos un nuevo Timer, pero que se ejecute mas rapido
    eltimer2=[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(metodo2) userInfo:nil repeats:YES];
    
    //Establecemos el valor del contador mas menos a 1
    [spMasMenos setValue:1];
    lblNumero.text=[NSString stringWithFormat:@»%.0f», spMasMenos.value];
    
    //nota: con @»%.0f», estamos mostrando el float/double con 0 decimales
    
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    
}
– (IBAction)spMasMenos_valueChanged:(id)sender {
    //Cada vez que cambie el valor, actualizamos para saber la velocidad
    lblNumero.text=[NSString stringWithFormat:@»%.0f», spMasMenos.value];
//Este metodo se ejecutara una vez por segundo, de forma indefinica
-(void) metodo{
    //Incrementamos el contador
    contador++;
    
    //Actualizamos el estado del label con el contenido del timer
    lblTiempo.text=[NSString stringWithFormat:@»%d», contador];
    
    //Vamos a mover la bola
    //Para eso, lo unico que hacemos es cambiar el valor de su centro, haciendo
    //uso del value que hay en el componente Stepper con el nombre
    //spMasMenos. Podria ser una constante como 1, sin ningun problema
    imgBola.center=CGPointMake(imgBola.center.x+spMasMenos.value, imgBola.center.y+spMasMenos.value);
    
}
//Este metodo se ejecutara 100 veces cada segundo, de forma indefinida
-(void) metodo2{
    //Incrementamos el contador
    contador2++;
    
    //Actualizamos el estado del label con el contenido del timer
    lblTiempo2.text=[NSString stringWithFormat:@»%d», contador2];
    
    //Vamos a mover la bola2
    imgBola2.center=CGPointMake(imgBola2.center.x+1, imgBola2.center.y+1);
    
}
– (void)viewDidUnload
{
    [self setLblTiempo:nil];
    [self setLblTiempo2:nil];
    [self setImgBola:nil];
    [self setImgBola2:nil];
    [self setSpMasMenos:nil];
    [self setLblNumero: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 {
    [lblTiempo release];
    [lblTiempo2 release];
    [imgBola release];
    [imgBola2 release];
    [spMasMenos release];
    [lblNumero release];
    [super dealloc];
}
@end

Aprendiendo Objetive-C para IOS (Dia 8)

Guion del blog de curso de Objetive-C para IOS – DIA 8
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 un UIPickerView, cogiendo los datos de un vector, y haciendolo de tal manera que podamos interactuar con el picare, para poder recoger los datos, y mostrarlos o añadirlos a un cuadro de texto.
En primer lugar, creamos un interface con el Builder, con un TextView, un PickerView y 4 Botones.

Creamos los diferentes outlets de los botones, textview y picare, así como las acciones al pulsar en cada uno de los botones.
También creamos un objeto NSMutableArray llamado colores, que contendrá los nombre de los colores que queramos
Los archivos ViewController.h y ViewController.m quedaran así:
//
//  ViewController.h
//  Diario008
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController {
    NSMutableArray *colores;
}
@property (retain, nonatomic) IBOutlet UITextView *txtTexto;
@property (retain, nonatomic) IBOutlet UIPickerView *pvOpciones;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton1;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton2;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton3;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton4;
– (IBAction)btnBoton1_touchUpInside:(id)sender;
– (IBAction)btnBoton2_touchUpInside:(id)sender;
– (IBAction)btnBoton3_touchUpInside:(id)sender;
– (IBAction)btnBoton4_touchUpInside:(id)sender;
@end
//
//  ViewController.m
//  Diario008
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «ViewController.h»
@implementation ViewController
    
@synthesize txtTexto;
@synthesize pvOpciones;
@synthesize btnBoton1;
@synthesize btnBoton2;
@synthesize btnBoton3;
@synthesize btnBoton4;
————————-
————————-
Hasta ahora nada poco habitual. Ahora queremos que nuestro pickerview funcione, con lo que tenemos que seguir una serie de pautas.
Un UIPickerView, es un componente que NO PUEDE FUNCIONAR sino le establecemos quien es el delegado de sus acciones, y de donde provienen sus datos. De manera que es un componente que esta ligado a una cosa que se llama protocolos. De manera que para que este funcione, debemos implementar 2 protocolos fundamentales, UIPickerViewDelegate y UIPickerViewDataSource.
Pero que quiere decir esto? Basicamente, estamos firmando un contrato, como que nos comprometemos a implementar los métodos necesarios, para que estos dos protocolos funcionen, de manera que, tendremos obligatoriamente, que implementar una serie de métodos.
En primer lugar, en el archivo ViewController.h, debemos sustituir esto:
@interface ViewController : UIViewController {
    NSMutableArray *colores;
}
por esto otro
@interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
    NSMutableArray *colores;
}
De esta forma de decimos, que nos comprometemos a implementar esos dos protocolos
Asi que el archivo ViewController.h quedara de forma definitiva así:
————————-
————————-
//
//  ViewController.h
//  Diario008
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> {
    NSMutableArray *colores;
}
@property (retain, nonatomic) IBOutlet UITextView *txtTexto;
@property (retain, nonatomic) IBOutlet UIPickerView *pvOpciones;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton1;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton2;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton3;
@property (retain, nonatomic) IBOutlet UIButton *btnBoton4;
– (IBAction)btnBoton1_touchUpInside:(id)sender;
– (IBAction)btnBoton2_touchUpInside:(id)sender;
– (IBAction)btnBoton3_touchUpInside:(id)sender;
– (IBAction)btnBoton4_touchUpInside:(id)sender;
@end
————————-
————————-
Los métodos que tenemos que implementar obligatoriamente, los escribiremos en el fichero ViewController.m, y serán estos métodos:
nota: pvOpciones es el nombre de mi pickerView
//———————–
//OBLIGATORIO: Le decimos el numero de componentes en el Picker view. En nuestro caso, solo 1
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pvOpciones{
    
}
//OBLIGATORIO:Le decimos el numero de filas del componentes. En nuestro caso, es el umero de elementos del array colores
– (NSInteger)pickerView:(UIPickerView *)pvOpciones numberOfRowsInComponent:(NSInteger)component{
    
}
//OBLIGATORIO:Le decimos, que el lo que se tiene que mostrar en cada una de las filas. Le decimos, que el elemento de
//vector colores
– (NSString *)pickerView:(UIPickerView *)pvOpciones titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    
}
//OPCIONAL: Para ver que hacer si se elige un elemento
– (void)pickerView:(UIPickerView *)pvOpciones didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    
}
//———————–
El archivo ViewController.m, quedara de forma definitiva así:
//
//  ViewController.m
//  Diario008
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «ViewController.h»
@implementation ViewController
@synthesize txtTexto;
@synthesize pvOpciones;
@synthesize btnBoton1;
@synthesize btnBoton2;
@synthesize btnBoton3;
@synthesize btnBoton4;
– (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.
    
    //Establecemos el texto originalmente en vacio
    [txtTexto setText:@» «];
    
    //Vamos a agregar elementos al picker
    //Primero creamos un array con lo que queremos añadir
    colores = [[NSMutableArray alloc] init];
    [colores addObject:@»rojo»];
    [colores addObject:@»verde»];
    [colores addObject:@»Azul»];
    [colores addObject:@»Amarillo»];
    [colores addObject:@»Rosado»];
    [colores addObject:@»Blanco»];
    
    
    
    
}
– (void)viewDidUnload
{
    [self setTxtTexto:nil];
    [self setPvOpciones:nil];
    [self setBtnBoton1:nil];
    [self setBtnBoton2:nil];
    [self setBtnBoton3:nil];
    [self setBtnBoton4: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 {
    [txtTexto release];
    [pvOpciones release];
    [btnBoton1 release];
    [btnBoton2 release];
    [btnBoton3 release];
    [btnBoton4 release];
    [super dealloc];
}
– (IBAction)btnBoton1_touchUpInside:(id)sender {
    
    //Con esto estableceriamos el texto en el boton que pongamos
    [txtTexto setText:@»Hola que tal»];
    
}
– (IBAction)btnBoton2_touchUpInside:(id)sender {
    //Con esto vamos añadiendo texto al existente
    [txtTexto insertText:@»Otro texto»];
}
– (IBAction)btnBoton3_touchUpInside:(id)sender {
    //Con esto añadimos al texto, el indice del elemento seleccionado en el pickerview
    [txtTexto insertText:[NSString stringWithFormat:@»%i», [pvOpciones selectedRowInComponent:0]]];
}
– (IBAction)btnBoton4_touchUpInside:(id)sender {
    //Con esto añadimos al texto, el nombre del elemento, accediendo al vector de colores
    [txtTexto insertText:[NSString stringWithFormat:@»%@», [colores objectAtIndex:[pvOpciones selectedRowInComponent:0]]]];
}
//———————–
//Estamos oblligados a establecer estos metodos, ya que nos hemos comprometido a hacerlo al 
//decirle que usamos los protocolos <UIPickerViewDelegate, UIPickerViewDataSource>, en el ViewController.h
//OBLIGATORIO: Le decimos el numero de componentes en el Picker view. En nuestro caso, solo 1
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pvOpciones{
    return 1;
}
//OBLIGATORIO:Le decimos el numero de filas del componentes. En nuestro caso, es el umero de elementos del array colores
– (NSInteger)pickerView:(UIPickerView *)pvOpciones numberOfRowsInComponent:(NSInteger)component{
    return [colores count];
}
//OBLIGATORIO:Le decimos, que el lo que se tiene que mostrar en cada una de las filas. Le decimos, que el elemento de
//vector colores
– (NSString *)pickerView:(UIPickerView *)pvOpciones titleForRow:(NSInteger)row forComponent:(NSInteger)component{
    return [colores objectAtIndex:row];
}
//OPCIONAL: Para ver que hacer si se elige un elemento
– (void)pickerView:(UIPickerView *)pvOpciones didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
    [txtTexto insertText:[NSString stringWithFormat:@»%@», [colores objectAtIndex:row]]];
}
//———————–
@end

——————-
——————-

——————-
——————-

SUPER IMPORTANTE:
Debemos conectar tanto el delegate del componente PickerView, como el datasoure, con el FileOwner.
Para esto, nos vamos al archivo xib, elegimos el PickerView, y en el inspector de conections, arrastramos sus dos outlets (primero uno, y luego el otro), ahacia filesowner.

Ver imagen:

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