Aprendiendo Objetive-C para IOS (Dia 22)

Guion del blog de curso de Objetive-C para IOS – DIA 22
—————————————————————————–
CREANDO UNA APLICACION COMPLETA, Y SUBIENDOLA AL APPSTORE PARTE 4:
Vamos a ver hoy como al pinchar en el boton de arriba a la derecha de nuestra vista principal, abrimos informacion sobre la aplicacion.
Para eso, creamos una nueva clase basada en UIVIewCOntroller, y la llmaremos intruccionesViewController.

Vamos al view controller de nuestra vista, y cambiamos el class identifier por instruccionesViewController
El segue ya esta creado desde el boton de arriba a la derecha, si no fuera asi, lo creamos usando la tecla de CTRL
Creamos el outlet del UIWebView

Veamos como queda el .h y el .m
//
//  instruccionesViewController.h
//  Metabolismo Basal
//
//  Created by david fraj blesa on 26/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface instruccionesViewController : UIViewController{
    
}
@property (weak, nonatomic) IBOutlet UIWebView *wvInstrucciones;
@end
————-
//
//  instruccionesViewController.m
//  Metabolismo Basal
//
//  Created by david fraj blesa on 26/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «instruccionesViewController.h»
@implementation instruccionesViewController
@synthesize txtIntrucciones;
@synthesize wvInstrucciones;
– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
– (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn’t have a superview.
    [super didReceiveMemoryWarning];
    
    // Release any cached data, images, etc that aren’t in use.
}
#pragma mark – View lifecycle
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
– (void)loadView
{
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
– (void)viewDidLoad
{
    [super viewDidLoad];
    //ESTO ES LO UNICO QUE TENEMOS QUE TENER EN CUENTA, YA QUE AQUI SE PONDRA EL CODIGO HTML NECESARIO
    [wvInstrucciones loadHTMLString:@»aqui el codigo en HTML» baseURL:nil];
    
    
    
}
– (void)viewDidUnload
{
    [self setTxtIntrucciones:nil];
    [self setWvInstrucciones:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
————-
Y con esto ya tenemos lista nuestra apliacion!!!
Mañana retoques finales!!
————-
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.
————-

Aprendiendo Objetive-C para IOS (Dia 21)

Guion del blog de curso de Objetive-C para IOS – DIA 21
—————————————————————————–
CREANDO UNA APLICACION COMPLETA, Y SUBIENDOLA AL APPSTORE PARTE 3:
Seguimos con la aplicacion para el calculo del metabolismo basal.
Vamos a ver como podemos apañarnoslas para que al pulsar en informe, nos habra la vista de detalles, y nos muestre informacion extra dependiendo de nuestros resultados

Lo primero que vamos a hacer, es crearnos una nueva clase, basandones en UIVIewCOntroller, a la que llamaremos informeViewController.
A la vista del informe, le cambiaremos su class identifier, por informeViewController
Creamos todos los outlets, y el codigo quedara algo asi:
nota: resultado y sexo, son dos variables que nos creamos para lo que viene a continuacion
//
//  informeViewController.h
//  Metabolismo Basal
//
//  Created by david fraj blesa on 26/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface informeViewController : UIViewController<ADBannerViewDelegate>{
}
@property float resultado;
@property int sexo;
@property (weak, nonatomic) IBOutlet UILabel *lblBasalNormal;
@property (weak, nonatomic) IBOutlet UILabel *lblSexo;
@property (weak, nonatomic) IBOutlet UILabel *lblActividadNormal;
@property (weak, nonatomic) IBOutlet UILabel *lblActividadPoca;
@property (weak, nonatomic) IBOutlet UILabel *lblActividadModerada;
@property (weak, nonatomic) IBOutlet UILabel *lblActividadIntensa;
@end
————-
Y aqui vemos el fichero  informeViewController.m:
//
//  informeViewController.m
//  Metabolismo Basal
//
//  Created by david fraj blesa on 26/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «informeViewController.h»
@implementation informeViewController
@synthesize resultado;
@synthesize sexo;
@synthesize lblBasalNormal;
@synthesize lblSexo;
@synthesize lblActividadNormal;
@synthesize lblActividadPoca;
@synthesize lblActividadModerada;
@synthesize lblActividadIntensa;
– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
– (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn’t have a superview.
    [super didReceiveMemoryWarning];
    
    // Release any cached data, images, etc that aren’t in use.
}
#pragma mark – View lifecycle
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
– (void)loadView
{
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
– (void)viewDidLoad
{
    [super viewDidLoad];
    
    
    
    //Escribimos el metabolismo basal
    lblBasalNormal.text=[NSString stringWithFormat:@»%f calorias», self.resultado];
    
    //Escribimos el sexo y l actividad segun sexo
    if(self.sexo==0){
        lblSexo.text=@»Hombre»;
        lblActividadPoca.text=[NSString stringWithFormat:@»Poca actividad: %f calorias», self.resultado*1.2];
        lblActividadNormal.text=[NSString stringWithFormat:@»Actividad normal: %f calorias», self.resultado*1.55];
        lblActividadModerada.text=[NSString stringWithFormat:@»Actividad moderada: %f calorias», self.resultado*1.77];
        lblActividadIntensa.text=[NSString stringWithFormat:@»Actividad intensa: %f calorias», self.resultado*2.1];
        
    }else{
        lblSexo.text=@»Mujer»;
        lblActividadPoca.text=[NSString stringWithFormat:@»Poca actividad: %f calorias», self.resultado*1.2];
        lblActividadNormal.text=[NSString stringWithFormat:@»Actividad normal: %f calorias», self.resultado*1.56];
        lblActividadModerada.text=[NSString stringWithFormat:@»Actividad moderada: %f calorias», self.resultado*1.64];
        lblActividadIntensa.text=[NSString stringWithFormat:@»Actividad intensa: %f calorias», self.resultado*1.82];
    }
    
    
}
– (void)viewDidUnload
{
    [self setLblBasalNormal:nil];
    [self setLblSexo:nil];
    [self setLblActividadNormal:nil];
    [self setLblActividadPoca:nil];
    [self setLblActividadModerada:nil];
    [self setLblActividadIntensa:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
————-
Como vemos, estamos dando por supuesto que «resultado» contiene el numero de calorias calculadas, y «sexo», contiene el sexo elegido, pero como se lo pasamos desde
el principal al informe??
Lo primero que tenemos que hacer es darle un identificador al segue que hemos creado al pulsar en el boton informe.
Para eso vamos al storyboard, y pinchamos en el dibujito del segue. Yo he elegido como nombre de indentificador «segueInforme»
Una vez hecho esto, vamos a añadir el siguiente metodo ANTES la ultima linea de principalViewController.m donde pone @end.
en principalViewController.m, tenemos que añadir #import «informeViewController.h»
//Con esto, le pasamos a la vista lo que queramos. Hemos tenido que importar en la linea de arriba, el informeViewController.h
– (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    //Vamos a ejecutar lo que sea, solo en el caso que el identificador del segue, coincida con el que estamos pulsando.
    if([segue.identifier isEqualToString:@»segueInforme»]){
        //Creamos una instancia de DetailViewController. Por eso hemos importado antes
        informeViewController *informe =segue.destinationViewController;
        
        //Le damos el valor a la propiedad
//AQUI ESTA LO IMPORTANTE
//ASI LE ESTAMOS DANDO LOS VALORES DE ESTA PROPIEDADES, Y POR ESO PODRA REALIZAR LOS CALCULOS
        informe.resultado=[lblResultado.text floatValue];
        informe.sexo=sexoActual;
    }
    
    
    
}
————-
Esto es todo por hoy!!
Mañana mas!!
Un saludo
————-
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.
————-

Aprendiendo Objetive-C para IOS (Dia 20)

Guion del blog de curso de Objetive-C para IOS – DIA 20
—————————————————————————–
CREANDO UNA APLICACION COMPLETA, Y SUBIENDOLA AL APPSTORE PARTE 2:
Seguimos con la aplicacion para el calculo del metabolismo basal.
Lo primero de todo, es crearnos el archivo que va a contener la programacion principal. Para eso, creo una nueva subclase, basandome en UIViewController, y la
voy a llamar principalViewController

El siquiente paso, es decirle a mi vista que tiene la calculadora, que se base en dicha vista. Para eso, en la pestaña de identifier, cambio el actual, por principalViewController

Vamos a crear los outlets y actions, arrastrando con la tecla CTRL, hacia el archivo principalViewController.h
Vemos como queda el principalViewController.h:
//
//  principalViewController.h
//  Metabolismo Basal
//
//  Created by david fraj blesa on 26/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface principalViewController : UIViewController<ADBannerViewDelegate>{
//@interface principalViewController : UIViewController{
    NSInteger campoActual;
    NSInteger sexoActual;
    NSString *cadenaComodin;
    
}
@property (nonatomic,assign) BOOL bannerIsVisible;
//Creamos las diferentes propiedades
@property (weak, nonatomic) IBOutlet UILabel *lblEdad;
@property (weak, nonatomic) IBOutlet UILabel *lblPeso;
@property (weak, nonatomic) IBOutlet UILabel *lblAltura;
@property (weak, nonatomic) IBOutlet UILabel *lblResultado;
@property (weak, nonatomic) IBOutlet UIButton *btnEdad;
@property (weak, nonatomic) IBOutlet UIButton *btnPeso;
@property (weak, nonatomic) IBOutlet UIButton *btnAltura;
@property (weak, nonatomic) IBOutlet UILabel *lblResultadoMetabolismoPara;
@property (weak, nonatomic) IBOutlet UIButton *btnSexo;
@property (weak, nonatomic) IBOutlet UIButton *btnInforme;
//Creamos los diferentes Actions para cada boton de digitos
– (IBAction)btnLimpia_click:(id)sender;
– (IBAction)btnComa_click:(id)sender;
– (IBAction)btnCero_click:(id)sender;
– (IBAction)btnUno_click:(id)sender;
– (IBAction)btnDos_click:(id)sender;
– (IBAction)btnTres_click:(id)sender;
– (IBAction)btnCuatro_click:(id)sender;
– (IBAction)btnCinco_click:(id)sender;
– (IBAction)btnSeis_click:(id)sender;
– (IBAction)btnSiete_click:(id)sender;
– (IBAction)btnOcho_click:(id)sender;
– (IBAction)btnNueve_click:(id)sender;
– (IBAction)btnLimpiaTodo_click:(id)sender;
– (IBAction)btnSexo_click:(id)sender;
– (IBAction)btnCalcular_click:(id)sender;
//Vamos a crear las acciones para elegir si queremos cambiar la edad, el peso o la altura.
– (IBAction)btnEdad_click:(id)sender;
– (IBAction)btnPeso_click:(id)sender;
– (IBAction)btnAltura_click:(id)sender;
@end
Ya tenemos todos nuestros outlets creado. Intentar siempre respetar los nombres de los eventos, para que luego no nos liemos mas adelante.
Vayamos ahora con el archivo principalViewController.m
Este archivo va a tener mucho codigo, asi que lo voy a pegar tal cual, y lo voy a explicar en el propio fichero.
//
//  principalViewController.m
//  Metabolismo Basal
//
//  Created by david fraj blesa on 26/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «principalViewController.h»
@implementation principalViewController
//AQUI TENEMOS TODOS LOS SYNTHSIZE, PARA los diferentes elementos
@synthesize lblEdad;
@synthesize lblPeso;
@synthesize lblAltura;
@synthesize lblResultado;
@synthesize btnEdad;
@synthesize btnPeso;
@synthesize btnAltura;
@synthesize lblResultadoMetabolismoPara;
@synthesize btnSexo;
@synthesize btnInforme;
– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}
– (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn’t have a superview.
    [super didReceiveMemoryWarning];
    
    // Release any cached data, images, etc that aren’t in use.
}
#pragma mark – View lifecycle
/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
– (void)loadView
{
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
– (void)viewDidLoad
{
   
    
    [super viewDidLoad];
    
    //Inicializamos variables declaradas en el .h
//Con la variable campoActual, controlamos que caracteristica que estamos modificando actualmente
//De esa forma, cuando pulsemos en el boton de peso, altura o edad, cambiaremos esta variable, para controlar
//lo que se modificara
    campoActual=0; //0 para edad, 1 para peso, 2 para altura
//A continuacion, rellenamos la variable auxiliar, para poder realizar diferentes calculos
    cadenaComodin=@»»; //La cadena estara vacia
//En esta variable, controlaremos si tenemos que realizar los calculos para una mujer o para un hombre
    sexoActual=0; //0 para hombre, 1 para mujer
//Establecemos el contenido del boton para que podamos cambiarlo al sexo opuesto.
//Fijaos como se establece el texto para un estado Normal del boton
    [btnSexo setTitle:@»Mujer» forState:UIControlStateNormal];
    
    //Establecemos la flecha apuntadora
//Esta flecha nos ayudara a saber cual estamos modificando
    [btnEdad setTitle:@»<-« forState:UIControlStateNormal];
    
}
– (void)viewDidUnload
{
    [self setLblEdad:nil];
    [self setLblPeso:nil];
    [self setLblAltura:nil];
    [self setLblResultado:nil];
    [self setBtnEdad:nil];
    [self setBtnPeso:nil];
    [self setBtnAltura:nil];
    [self setLblResultadoMetabolismoPara:nil];
    [self setBtnSexo:nil];
    [self setBtnInforme:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
////////////////////////////////////////////////////////////////////////////////////////
//METODOS PARA CAMBIAR LA FLECHA QUE NOS DIRA SI ESTAMOS MODIFICANDO EDAD, ALTURA O PESO
//Simplemente al pulsar, establecemos con la variable campoActual, cual modificaremos, y 
//ponemos el texto correcto en su sitio
– (IBAction)btnEdad_click:(id)sender {
    
    campoActual=0;
    
    [btnEdad setTitle:@»<-« forState:UIControlStateNormal];
    [btnPeso setTitle:@»» forState:UIControlStateNormal];
    [btnAltura setTitle:@»» forState:UIControlStateNormal];
    
}
– (IBAction)btnPeso_click:(id)sender {
    
    campoActual=1;
    
    [btnEdad setTitle:@»» forState:UIControlStateNormal];
    [btnPeso setTitle:@»<-« forState:UIControlStateNormal];
    [btnAltura setTitle:@»» forState:UIControlStateNormal];
    
}
– (IBAction)btnAltura_click:(id)sender {
    
    campoActual=2;
    
    [btnEdad setTitle:@»» forState:UIControlStateNormal];
    [btnPeso setTitle:@»» forState:UIControlStateNormal];
    [btnAltura setTitle:@»<-« forState:UIControlStateNormal];    
    
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//METODOS para limpiar el campo actual, si se le da al boton limpia
– (IBAction)btnLimpia_click:(id)sender {
    
    //Limpiamos el contenido del que sea el campo Actual
    switch(campoActual){
        case 0:
            lblEdad.text=@»0″;
            break;
        case 1:
            lblPeso.text=@»0″;
            break;
        case 2:
            lblAltura.text=@»0″;
            break;
    }
    
    
    
}
//O si se le da al boton limpiatodo
– (IBAction)btnLimpiaTodo_click:(id)sender {
    
    //Limpiamos el contenido de todo
    lblEdad.text=@»0″;
    lblPeso.text=@»0″;
    lblAltura.text=@»0″;
    lblResultado.text=@»0″;
    btnInforme.enabled=false;
    
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//Metodo para establecer el sexo, y cambiar el texto del boton y del label correspondiente
– (IBAction)btnSexo_click:(id)sender {
    
    //Cambiamos el Sexo para el que calcularemos el metabolismo basal,  dependiendo de si antes era hombre o mujer
    if(sexoActual==0){
        sexoActual=1;
        [btnSexo setTitle:@»Hombre»forState:UIControlStateNormal];
        lblResultadoMetabolismoPara.text=@»Resultado de Metabolismo Basal para Mujer:»;
    }else{
        sexoActual=0;
        [btnSexo setTitle:@»Mujer» forState:UIControlStateNormal];
        lblResultadoMetabolismoPara.text=@»Resultado de Metabolismo Basal para Hombre:»;
    }
    
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////
//METODOS PARA QUE AL PULSAR EN LOS DIGITOS, O EN LA COMA DECIMAL, SE VAYA RELLENANDO EL
//CAMPO ACTUAL
//
//Aqui todos los metodos son iguales, excepto la pulsacion del cero.
//
//Lo que se hace es, dependiendo de campoActual que contine el campo que se esta modificando (peso, altura o edad)
//Se pasa el texto al comodin, y se le añade el digito o coma
//
//Una vez terminado, se vuelve a volcar al adecuado usando de nuevo campoActual
//
//La pulsacion del cero cambia, ya que si solo esta el cero escrito, no se tiene que hacer nada.
//Por lo demas es lo mismo
– (IBAction)btnComa_click:(id)sender {
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    //Metemos en la cadena una coma
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»,»];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
    
    
}
– (IBAction)btnCero_click:(id)sender {
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        //No se hace nada
    }else{
        cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»0″];
    }
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
    
}
– (IBAction)btnUno_click:(id)sender {
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»1″];
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
    
    
}
– (IBAction)btnDos_click:(id)sender {
    
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»2″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
– (IBAction)btnTres_click:(id)sender {
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»3″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
– (IBAction)btnCuatro_click:(id)sender {
    
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»4″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
– (IBAction)btnCinco_click:(id)sender {
    
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»5″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
– (IBAction)btnSeis_click:(id)sender {
    
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»6″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
– (IBAction)btnSiete_click:(id)sender {
    
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»7″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
– (IBAction)btnOcho_click:(id)sender {
    
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»8″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
– (IBAction)btnNueve_click:(id)sender {
    
    
    //Metemos el texto que estamos empleando, en nuestra cadena comodin
    switch(campoActual){
        case 0:
            cadenaComodin=lblEdad.text;
            break;
        case 1:
            cadenaComodin=lblPeso.text;
            break;
        case 2:
            cadenaComodin=lblAltura.text;
            break;
    }
    
    
    if([cadenaComodin isEqualToString:@»0″]){
        cadenaComodin=@»»;
    }
    cadenaComodin=[NSString stringWithFormat:@»%@%@»,cadenaComodin,@»9″];
    
    
    //Hacemos el paso contrario, la cadena que estemos empleando, la metemos en el campoActual
    switch(campoActual){
        case 0:
            lblEdad.text=cadenaComodin;
            break;
        case 1:
            lblPeso.text=cadenaComodin;
            break;
        case 2:
            lblAltura.text=cadenaComodin;
            break;
    }
}
////////////////////////////////////////////////////////////////////////////
//REALIZAMOS EL CALCULO, al pulsar el boton calcular
//NOTA: Fijaos como extraemos de los labels, el valor de float, en vez del string
– (IBAction)btnCalcular_click:(id)sender {
    
    //Realizamos los calculos en funcion si es mujer u hombre
    float resultado;
    if(sexoActual==0){
        //Calculo para hombre
        resultado=66.473 + (13.751 * [lblPeso.text floatValue]) + (5.0033 * [lblAltura.text floatValue]) – (6.55*[lblEdad.text floatValue]);                           
    }else{
        //Calculo para mujer:
        resultado=655.1 + (9.463 * [lblPeso.text floatValue]) + (1.8 * [lblAltura.text floatValue]) – (4.6756*[lblEdad.text floatValue]);
    }
    
    //Volcamos los calculos en la etiqueta:
    lblResultado.text=[NSString stringWithFormat:@»%f cal», resultado];
    
    //Activamos la casilla de informe
//COmo hemos realizado el calculo, activamos la casilla de informe, para sacar un informe detallado
    btnInforme.enabled=true;
    
}
@end
—————-
Y hasta aqui por hoy!
Mañana vamos a ver como al pulsar el boton informe, obtenemos el resto de los datos
Un saludo
————-
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.
————-

Aprendiendo Objetive-C para IOS (Dia 19)

Guion del blog de curso de Objetive-C para IOS – DIA 19
—————————————————————————–
CREANDO UNA APLICACION COMPLETA, Y SUBIENDOLA AL APPSTORE PARTE 1:
Vamos a crear una aplicacion completa, para repasar cosillas que hemos estado viendo en este diario, y vamos a subir todo esto al appstore.

Esto lo realizaremos en varios dias, ya que este proceso conlleva a la utilizacion de los certificados, dar de alta en el appstore, etc etc.
Vamos a crear una Calculadora del Metabolismo Basal…….. y que es esto??? Pues es una calculadora que se utiliza para poder calcular cuantas calorias necesita nuestro
cuerpo como Minimo para poder vivir, dependiendo de nuestra edad, sexo, altura, peso, asi como el gasto calorifico añadido dependiendo de nuestra actividad fisica.
Y porque este proyecto, porque queria que fuese una aplicacion sencilla, que nos permita repasar un monton de cosas vistas hasta ahora, y que sea una aplicacion que no existe en el appstore, al menos
en Español.
Basicamente necesitaremos bien poco. Vistas necesarias:
Vista principal:
Para poder realizar los diferentes calculos
Vista de indormacion:
Con las intrucciones, y un poco de informacion recogida de wikipedia, para saber de que va esto.
Vista detalles:
Para poder ver mas detalles de calculo, asi como el gasto calorifico dependiendo del tipo de actividad.
Como nos gustaria que esto fuera todo navegable, lo mejor que podemos hacer, es que sea un Controllador de tipo NAVIGATOR.
Manos a la obra!!!
En esta primera parte, vamos a crear lo que es la parte mas grafica
Asi que creamos un nuevo proyecto, que sea de tipo Single-view.

Una vez hecho esto, nos vamos a nuestro storyboard, y borramos el view creamos, y añadimos un Navigation View controller.

Nos creara el navigation view controller, y una primera vista. En esta vista vamos  a poner todo lo que seria nuestro interface principal
A continuacion añadimos otra vista que contendra Informacion sobre el Metabolismo Basal
Y por ultimo una tercera vista que tendra lo que seria Los detalles del calculo.
Puede quedar asi:

Basicamente, tenemos varios labels para los textos fijos, asi como 4 labels para los valores de la edad, altura, peso, y calorias.
A la derecha de cada 0, tenemos un boton que nos servira para elegir cada uno de los elementos que queremos modificar.
Luego tenemos los diferentes botones, con los numeros del 0 al 9, asi como la coma decimal
El boton MUJER, servira para cambiar entre hombre y mujer
El boton CALCULA, servira para realizar el calculo
El boton INFORME, servira para acceder a un informe mas detallado de los datos
El Boton LIMPIA TODO, pone a cero todos los contadores
el Boton LIMPIA, pone a cero, aquel elemento que estemos modificando es este momento
En la parte inferior, pondremo un iAD, para poder sacar publicidad en nuestra aplicacion. Os recomiendo no hacerlo de momento, ya que no hemos visto
aun como añadir el framework adecuado, y la aplicacion no funcionara. Asi que de momento, lo dejamos en pendiente.

Creamos un segue desde el boton de la barra del principal, hacia la vista de informacion
La vista informacion, solo tendra un UIVIewController, para sacar informacion en formato HTML de nuestra apliacion
(Sera en formato HTML, porque asi es mas comodo poner texto)
Creamos otro segue desde el boton Informe, a la tercera vista.
La vista Informe, tendra varios labels que mostraran diferente informacion. Algunos labels seran fijos, y otros se rellenaran con la informacion adecuada

De momento eso es todo. Mañana empezaremos con la logica de la aplicacion.
Un saludo a todos!!
————-
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.
————-

Aprendiendo Objetive-C para IOS (Dia 18)

Guion del blog de curso de Objetive-C para IOS – DIA 18
—————————————————————————–
Seguimos con el proyecto anterior, y esta vez, vamos a ver como podemos mostrar un detalle dependiendo de la celda que seleccionemos.

Vamos a crearnos algunos controles en el DetailViewController, para poder asi mostrar una informacion u otra, dependiendo de donde pulsamos. Agregamos Un Label para saber lo que estamos haciendo, y creamos el outlet necesario

El codigo de mi DetailViewController.h, quedara asi:
//
//  DetailViewController.h
//  Diario017
//
//  Created by david fraj blesa on 25/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController
@property (strong, nonatomic) id detailItem;
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (weak, nonatomic) IBOutlet UILabel *miEtiqueta;
@end
Siendo miEtiqueta, el Label que querremos actualizar, al pinchar en la celda que queramos.
Vamos a crear un SEGUE, de manera que arrastramos la celda prototipo manteniendo pulsado el CTRL, hasta el DetailViewController, y seleccionamos PUSH
Vamos ahora a por el codigo
//
//  MasterViewController.m
//  Diario017
//
//  Created by david fraj blesa on 25/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «MasterViewController.h»
//Por David Fraj Blesa
//Importamos el DetailViewController
#import «DetailViewController.h»
———–
Como vemos, tenemos que importar el DetailViewController.h
————-
Tenemos que añadir el siguiente metodo, al final de DetailViewController, para poder realizar las acciones necesarias:
//Con esto, le pasamos a la vista lo que queramos. Hemos tenido que importar en la linea de arriba, el detailViewController.h
– (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    //Creamos una instancia de DetailViewController. Por eso hemos importado antes
    DetailViewController *detailController =segue.destinationViewController;
    
    //Creamos un NSSTring, que usaremos para recoger el texto, de la celda seleccionada
    NSString *seleccionado = [self.miVector objectAtIndex:self.tableView.indexPathForSelectedRow.row];
    
    //Le decimos al detailItem, que texto queremos poner.
    detailController.detailItem = seleccionado;
    
    detailController.indice=self.tableView.indexPathForSelectedRow.row;
    
}
@end
————-
Veamos como queda el DetailViewController.h
//
//  DetailViewController.h
//  Diario017
//
//  Created by david fraj blesa on 25/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface DetailViewController : UIViewController
//Es una propiedad de tipo id, para recoger cualquier cosa
@property (strong, nonatomic) id detailItem;
//Propiedad para decoger la descripcion en un label
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
//Propiedad para decoger el indice en una etiqueta
@property (weak, nonatomic) IBOutlet UILabel *miEtiqueta;
//Propiedad para recoger un indice
@property (nonatomic) NSInteger indice;
@end
————-
Veamos como queda el DetailViewController.m
//
//  DetailViewController.m
//  Diario017
//
//  Created by david fraj blesa on 25/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «DetailViewController.h»
@interface DetailViewController ()
– (void)configureView;
@end
@implementation DetailViewController
@synthesize detailItem = _detailItem;
@synthesize detailDescriptionLabel = _detailDescriptionLabel;
@synthesize miEtiqueta = _miEtiqueta;
@synthesize indice = _indice;
#pragma mark – Managing the detail item
– (void)setDetailItem:(id)newDetailItem
{
    if (_detailItem != newDetailItem) {
        _detailItem = newDetailItem;
        
        // Update the view.
        [self configureView];
    }
}
– (void)configureView
{
    // Update the user interface for the detail item.
    //POR DAVID. AQUI VIENE LO IMPORTANTE
    if (self.detailItem) {
        //SI SE LE PASA UN detailItem
        //Actualiza el texto del primer label, con la propiedad description del detailItem
        self.detailDescriptionLabel.text = [self.detailItem description];
        
        //Actualiza la etiqueta, con el indice que le pasamos en indice.
        self.miEtiqueta.text = [NSString stringWithFormat:@»%i», self.indice];
        
        //IMPORTANTE!!!!
        //Fijaos como en este punto, y atraves del indice, podemos llamar a cualquier podicion de un vector sin ningun problema
        //Me voy a crear un vector con elementos para que lo veais:
        NSArray *unVector=[[NSArray alloc] initWithObjects:@»Cero», @»Uno», @»Dos», @»Tres», nil];
        
        //De esta forma, relleno la label con mas informacion
        self.miEtiqueta.text = [NSString stringWithFormat:@»%i – %@», self.indice, [unVector objectAtIndex:self.indice]];
        
        
    }
}
– (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.
    [self configureView];
}
– (void)viewDidUnload
{
    [self setMiEtiqueta: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);
}
@end
————-
Eso es todo de momento!!
Llegados a esto, podemos probar con un sinfin de datos de forma dinamica
————-
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.
————-

Aprendiendo Objetive-C para IOS (Dia 17)

Guion del blog de curso de Objetive-C para IOS – DIA 17
—————————————————————————–
Vamos a ver ahora, como crear el contenido de un Table View, de forma dinámica, así como al pinchar en un elemento, que se vea un detalle del mismo.

Para eso, creamos un nuevo proyecto, del tipo «master view detail», y usamos storyboart y ARC
Nos vamos al StoryBoard

Seleccionamos la Master View Controller, en el panel de la izquierda seleccionamos la TableView. En el inspector a la derecha cambiamos la propiedad Content a Dynamic Prototypes
Esto nos va a permitir, poder rellenar la tabla mediante codigo de programacion, haciendo asi todo mucho mas dinamico
Voy a cambiar la configuracion de la celda. Para eso, pincho en el prototipo de la celda, y en style, le pongo BASIC, y le doy un identificador propio, que sera miCelda
Vamos ahora con la programacion. Vamos a crearnos un vector con los diferentes elementos que queremos mostrar en el table view. Sera un vector de Strings.
Para eso, vamos al  MasterViewController.h
————————————————–
Esto podria quedar asi:
//
//  MasterViewController.h
//  Diario017
//
//  Created by david fraj blesa on 25/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface MasterViewController : UITableViewController
@property (strong) NSMutableArray *miVector;
@end
Ahora, vamos al  MasterViewController.m
————————————————–
Os pongo el codigo de como quedara. Fijaos bien en los comentarios
//
//  MasterViewController.m
//  Diario017
//
//  Created by david fraj blesa on 25/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «MasterViewController.h»
@implementation MasterViewController
//Añadido por DAVID: CREAMOS LOS GETTERS Y SETTERS
@synthesize miVector;
– (void)awakeFromNib
{
    [super awakeFromNib];
}
– (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
{
    [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
    //POR DAVID FRAJ: TAPAMOS ESTA LINEA
    //return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    //Y ESCRIBIMOS ESTO OTRO PARA QUE PERMITA CAMBIAR DE ORIENTACION:
    return YES;
}
/*
// Override to support conditional editing of the table view.
– (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/
/*
// Override to support editing the table view.
– (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source.
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
    }   
}
*/
/*
// Override to support rearranging the table view.
– (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/
/*
// Override to support conditional rearranging of the table view.
– (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/
//POR DAVID FRAJ BLESA:
//AÑADIMOS LOS SIGUIENTES METODOS:
//NUMERO DE SECCIONES QUE QUEREMOS QUE APAREZCAN:
– (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
//NUMERO DE FILAS, QUE SERA EL NUMERO DE ELEMENTOS DEL VECTOR
– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //POR DAVID: REVISAR LUEGO
    //DEVOLVEMOS EL NUMERO DE ELEMENTOS
    return [miVector count];
    
}
//QUE ES LO QUE QUEREMOS QUE APAREZCA EN CADA UNA DE LAS CELDAS
//A este metodo se le llamara, por cada uno de las filas que le hallamos dicho que tenemos justo en el metodo de arriba.
– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Creamos una nueva Variable de tipo celda
    UITableViewCell *celda = [tableView dequeueReusableCellWithIdentifier:@»miCelda»];
    
//LE damos a esa celda el contenido del vector
    celda.textLabel.text = [miVector objectAtIndex:indexPath.row];
    return celda;
}
@end
—————————————————-
VAMOS AHORA CON EL APPDELEGATE, PARA DARLE LA INFORMACION
—————–
//
//  AppDelegate.m
//  Diario017
//
//  Created by david fraj blesa on 25/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «AppDelegate.h»
//AÑADIDO POR DAVID
#import «MasterViewController.h»
@implementation AppDelegate
@synthesize window = _window;
– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    
    
    
    //POR DAVID FRAJ BLESA:
    //CREAMOS EL VECTOR CON LOS DATOS
    NSMutableArray *miVectorDesdeFuera=[NSMutableArray arrayWithObjects:@»70% de Descuento», @»60% de Descuento», @»40% de Descuento», @»30% de Descuento», nil];
    
    //Creamos una variable de tipo UINavigationController, y lo creamos pasandole un puntero desde nuestro propio rootViewController
    UINavigationController *navController = (UINavigationController *) self.window.rootViewController;
    
    //Como hemos importado desde arriba el MasterViewController, cogemos el elemento
    MasterViewController *masterController = [navController.viewControllers objectAtIndex:0];
    
    //Le asignamos al vector creado en MasterViewCOntroller, el vector creado 6 lineas arriba
    masterController.miVector=miVectorDesdeFuera;
    
    
    
    // Override point for customization after application launch.
    return YES;

…..

—————————————

HASTA aqui de momento hemos hemos consguido rellenar nuestra tabla. Mañana veremos como al hacer click, veremos el detalle adecuado a nuestra eleccion
————-
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.
————-

Aprendiendo Objetive-C para IOS (Dia 16)

Guion del blog de curso de Objetive-C para IOS – DIA 16
—————————————————————————–
Vamos a trabajar hoy con las tablas, usando las celdas de forma estática.
Para eso, creamos un nuevo proyecto con Storyboard, de una sola vista.

Nos vamos al Storyboard, borramos el VIEWCONTROLLER que tenemos, y Arrastramos un Navigation Controller.
Automaticamente, nos crear el Navigation Controller, enlazado con un View Controller que hace de ROOT View. Ese Root veis no nos sirve, porque nosotros queremos un Table View Controller. Asi que lo eliminamos.
Arrastamos un TableViewController
Y con la Tecla CTRL pulsada, arrastramos desde el navigation controller hasta el Table View Controller
En relationShip, elegimos root view controller
Nos vamos al inspector de atributos del table view controller, y elegimos STATIC CELLS

Nos habrá creado 3 celdas estáticas
En el listado de objetos de la derecha, podemos añadir todas las celdas que queramos, simplemente arrastrando el Table View Cell

Podemos cambiarle el Style para cambiar rapidamente el aspecto de la celda
Si queremos que al pulsar en una celda, vaya a otro View Controller, se puede hacer como siempre.
Agregamos otro view Controller a la escena, y creamos un SEGUE con la tecla CTRL pulsada. Elegimos pus, para que nos cree la navegación de forma automática

Como hemos empezado con un Navigation View  Controller, todos los segues PUSH que hagamos, nos respetaran la navegacion
————-
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.
————-

Aprendiendo Objetive-C para IOS (Dia 15)

Guion del blog de curso de Objetive-C para IOS – DIA 15
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 funciona el tema de los delegados y protocolos con xcode. La idea es que queremos tener 2 viewcontroller. En el primerViewController, tendremos un boton y una eltiqueta,  y el segundoViewController, tendremos un cuadro de texto y un boton.

El boton del primerViewController, lo unico que hara es abrir el segundoViewController, mediante el uso de un SEGUE

Cuando estemos en el segundoViewController, escribiremos algo en el campo de texto, y al darle al boton del segundoViewController, volveremos al primerViewController, y escribiremos el texto del campo de texto, en la etiqueta del primerViewController.

Para esto, creamos un proyecto con las caracteristicas de siempre:

Y Creamos el interface con los dos viewControllers.

A continuacion, tenemos que crearnos 2 subclasses, que derivaran de UIViewController, llamadas primerViewController, y segundoViewController

Una vez echo esto, tenemos que asociar cada uno de lo View Controller del interface grafico, con primerViewController, y segundoViewController. Eso lo haremos desde el interface Grafico, en el apartado identity inspector, tal como hemos hecho otras veces.

Tenemos ahora que crearnos los outlets correspondientes, arrastrando con la tecla CTRL pulsada, a cada uno de los viewControllers.

El codigo quedara de la siguiente forma:

En el primerViewController.h
—————————–

@property (strong, nonatomic) IBOutlet UILabel *etiqueta;
En el primerViewCOntroller.m
—————————–
@synthesize etiqueta;
En el segundoViewController.h
—————————————
@property (strong, nonatomic) IBOutlet UITextField *cajaTexto;
- (IBAction)volver:(id)sender;
En el segundoViewController.m
—————————————

@synthesize cajaTexto;
- (IBAction)volver:(id)sender {
    //Aqui el codigo para cuando pulsemos en el boton
}

Vamos ahora a por el codigo necesario para hacer la delegacion
———————————————————————————————————————

//
//  segundoViewController.h
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
//Vamos a crear un nuevo Delegate. Un delegate, es una respuesta ante un evento. Lo que hacemos es que, dentro de este delegate
//creamos un metodo llamado devolverValor, que recibira un texto
@protocol segundoViewControllerDelegate <NSObject>
– (void)devolverValor:(NSString *)texto;
@end
//Empieza el objeto segundoViewController.
@interface segundoViewController : UIViewController
//propiedad traida desde el interface builder
@property (strong, nonatomic) IBOutlet UITextField *cajaTexto;
//Creamos una nueva propiedad, que sera el delegado, y sera de tipo segundoViewController definido arriba
@property (nonatomic, weak) id <segundoViewControllerDelegate> delegate;
//Encabezado del metodo volver, que se ejecutara al pulsar el boton
– (IBAction)volver:(id)sender;
@end
//Finaliza el segundoViewController
———————————————————————————————————————
//
//  segundoViewController.m
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «segundoViewController.h»
@implementation segundoViewController
//Getter y Setters de cajaTexto
@synthesize cajaTexto;
//Getter y Setters de delegate
@synthesize delegate;
//Implementamos el metodo volver.
– (IBAction)volver:(id)sender {
    //El delegate, implementa el metodo devolverValor, al que le pasamos un texto, que sera el de cajaTexto
    [delegate devolverValor:self.cajaTexto.text];
}
– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{

………

———————————————————————————————————————

//
//  primerViewController.h
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
//Importamos el segundoViewCOntroller.h
#import «segundoViewController.h»
//Aqui es cuando le decimos, que hay que usar el protocolo segundoViewControllerDelegate, asi que tenemos
//que implementar obligatoriamente el metodo definido en el protocolo, que sera devolverValor
//Esto lo haremos en el primerViewController.m
@interface primerViewController : UIViewController <segundoViewControllerDelegate>{
    
}
@property (weak, nonatomic) IBOutlet UILabel *etiqueta;
@end





———————————————————————————————————————

//
//  primerViewController.m
//  Diario015
//
//  Created by david fraj blesa on 21/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «primerViewController.h»
@implementation primerViewController
@synthesize etiqueta;
//Como hemos puesto como protocolo obligatorio el <segundoViewController>, tenemos que implementar
//sus metodos si o si.
– (void)devolverValor:(NSString *)texto {
    self.etiqueta.text = texto;
    [self dismissModalViewControllerAnimated:YES];
}
//Al llamar al segundoViewController mediante el SEGUE, debemos decirle, cual es el delegate del segundoViewController.
//El delegate del segundoViewController, debe ser primerViewController.
– (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    segundoViewController * segundoViewController = segue.destinationViewController;
    segundoViewController.delegate = self;
}


– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
………



———————————————————————————————————————

Eso es todo!!!

Aqui hemos visto pues un ejemplo de como implementar un protocolo, y como usarlo dentro de nuestra clase.

Un saludo!!!

Como crear una campaña de publicidad de nuestra pagina de Facebook, en Facebook

Me ha llegado un correo promocional de Facebook, que me regalan 30 euros para promocionar la pagina. Vamos a ver paso por paso como canjear el cupon publicitario.

Buscamos en la pagina inferior de FACEBOOK, el apartado publicidad

 Pinchamos en Crear anuncio

Elegimos la pagina de la que queremos hacer publicidad. En mi caso DOÑA TAPA

 Rellenamos cierta informacion, tal como lo que deseamos promocionar, en mi caso la propia pagina Doña Tapa. Le decimos la descripcion, imagen, Vista de inicio (En mi caso la Biografia).

Fijaos a la derecha, como aparece la vista previa del anuncio, asi como el numero de personas a las que les aparecera el anuncio. De momento mas de 15.000.000!!!

Elegimos como pais España, y ademas elijo la ciudad Zaragoza, para que el publico del anuncio, sea lo mas ajustado posible. En mi caso, es un Bar-Restaurante de Zaragoza, asi que no me interesa que lo vean en el resto de España. Le digo que este a 10 millas a la redonda (Unos 16 Kilometros), y le digo que me interesa publico entre 18 y 65 años, de ambos sexos. No elijo la actividad, ya que hay poca gente en facebook, que dentro de sus aficiones ponga Bares/Restaurantes (De hecho en Zaragoza solo aparecen 20…….)

Vemos como nuestro publico se ha reducido a unos 270.000 Usuarios.

Le decimos el tipo de publico, y elegimos como OBJETIVO, el hacer clic en mi anuncio. De esa manera, solo nos cobraran si hacen clic en el anuncio, y no si se imprime como seria la otra opcion.

 Elegimos como moneda EUR, Spain, y Europe/Madrid.

Le damos un nombre a la campaña, y le ponemos un presupuesto, que puede ser diario o total. Yo he elegido total, ya que solo quiero gastarme los 30 Euros que me regalan.

Ponemos el limite, y nos dara una estimacion del coste por clic.(CPC)

A diferencia de otras webs, aqui se puede elegir entre una puja. Cuanto mas pongamos, mas probabilidades de que salga nuestro anuncio, y mas nos costara. Si ponemos muy muy poquito, se mostrara muy poquitas veces, y la campaña no valdra para nada.

Pinchamos en Revisar Anuncio

Y a continuacion en Realizar Pedido

Le decimos la forma de pago, en mi caso Paypal

Le ponemos usuario y contraseña, y le damos a pagar.

A continuacion, nos aparecera que pongamos el codigo que nos han enviado.

Y ya esta todo listo!!!!

Aprendiendo Objetive-C para IOS (Dia 14)

Guion del blog de curso de Objetive-C para IOS – DIA 14
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 hacer una jerarquiza completa, usando todos los elementos con NAvigation View Controller.

Por no variar, he usado un proyecto SIngle-View, he borrado el single View, y he insertado un Navigation View Controller.
Agrego cada uno de los view controlares existentes, de manera que tendré, a parte del Navigation View Controller, Un Tab Bar View Controller, Table View COntroller, Page veis Controller, View COntroller y GLKITView Controller (Aunque estos dos últimos no nos van a funcionar nada bien, pero así ponemos todos)
Puede quedar como a continuación:
Una vez terminado, vamos a añadir 5 botones a nuestro Root View Controller, y añadimos un segué desde cada botón del Root View Controller, hasta el Controller adecuado. NO OLVIDEIS ELEGIR PUSH
Podria quedar de esta forma.
Pero que pasa ahora si queremos programar algo???
Has ahora no hemos escrito ni un solo código de programación. En el Tab 1, queremos por ejemplo que al pulsar un botón, escriba el típico HOLA MUNDO en un Cuadro de texto.
Y como podemos hacer esto???
En versiones anteriores de XCODE, teníamos que cada pantallado o VIEW, venia con su archivo .h y .m, pero con storyboard ya no tenemos nada de esto. Asi que lo que tenemos que hacer, es crearnos una subclase, y asociarlo con la vista adecuada.
Para eso-> New File->UIViewCOntroller Subclass-> NEXT
Elegimos el nombre, como por ejemplo tabBarItem1, y le decimos que herede de UIViewController

Para poder continuar, tenemos que decirle a nuestro tab, que la clase NO es UIViewCOntroller, sino que es nuestra recién creada tabBarItem1
Para esto, vamos al identity Inspector del Tab bar 1, y donde pone CUSTOM CLASS, elegimos tabBarItem1
A continuación creamos los Outlets, adecuados, así como el IBACtion, que responda a la pulsación del botón
Quedara el archivo .h así:
//
//  tabBarItem1.h
//  Diario014
//
//  Created by david fraj blesa on 20/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface tabBarItem1 : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *btnBoton;
@property (weak, nonatomic) IBOutlet UITextField *txtTexto;
– (IBAction)btnBoton_TouchUpInside:(id)sender;
@end
Nos vamos al archivo .m, y vamos a programar el método de pulsar en el botón. Buscamos el método, y vemos como tiene que quedar algo así:
– (IBAction)btnBoton_TouchUpInside:(id)sender {
    
    txtTexto.text=@»Hola mundo»;
    
}
Asi que de momento terminamos. Esto se esta convirtiendo poco a poco en un mundo lleno de posibilidades!! eje.
Un saludo a todos