jueves, 14 de junio de 2012

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

3 comentarios:

  1. Muy bueno David y muy bien explicado. Gracias por compartir.

    ResponderEliminar
  2. Muy buenas, gracias por la información, me ha servido mucho. Una pregunta para el tema de CIF o NIE como seria? gracias.

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar