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 Comments