Reproducir sonidos en nuestras aplicaciones creadas con XCODE para iphone

Esto lo he cogido directamente del blog de Cocoa Mental, donde tienen un monton de informacion sobre diferentes temas de programacion para ios.
Lo pongo aqui por tenerlo a mano.
Su direccion: http://www.cocoaosx.com/2011/06/20/como-reproducir-sonidos-en-ios/

Formatos de Sonido para iPhone e iPad

Con Cocoa-Touch puedes reproducir sonidos en los siguientes formatos:

  1. wav (no comprimido)
  2. mp3 (comprimido)
  3. aiff (comprimido)
  4. caff (no comprimido)
Ogg, a fecha de hoy (Junio 2011) no es uno de ellos. Los formatos preferidos son CAFF (Core Audio File Format) y AIFF (Audio Interchange File Format). Son los que menos recursos consumirán.

¿Qué formato de sonido es más adecuado para iOS?

Para sonidos cortos, como un bip al tocar un botón, el ideal es CAFF. Al no ser comprimido, iOS no tendrá que perder el tiempo descomprimiéndolo y sonará casi instantaneamente. Apple recomienda no usarlo para ficheros de más de 30 segundos de duración.
Para sonidos más largos, es preferible usar el formato AIFF (que logra compresiones de hasta 4:1). iOS lo irá descomprimiendo sobre la marcha, a medida que lo reproduce.

Convertir sonidos al formato adecuado para Cocoa

Si tienes un sonido en mp3 o wav y deseas convertirlo a alguno de estos formatos, la herramienta necesaria viene incluída con el SDK de iPhone. Es una utilidad de linea de comandos llamada afconvert.
Algunos ejemplos del uso de afconvert:

#creates sound.caf (little endian, 16 bit)

afconvert -f caff -d LEI16 sound.wav
# creates sound.caf (little endian, 16 bit, 22kHz)
afconvert -f caff -d LEI16@22050 sound.wav
# creates sound.caf (little endian, 16 bit, MONO)
afconvert -f caff -d LEI16 -c 1 sound.wav
# creates sound.aifc (IMA4 compression)
afconvert -f AIFC -d ima4 sound.wav
# creates sound.aifc (IMA4 compression, MONO)
afconvert -f AIFC -d ima4 -c 1 sound.wav

Reproducir un sonido corto en iOS

Lo primero es añadir la siguiente framework a tu proyecto: AudioToolbox. Luego tienes que #import <AudioToolbox/AudioServices.h>

Crear un SystemSoundID para tu sonido

(void)viewDidLoad
{
    [superviewDidLoad];
    NSString *path = [[NSBundlemainBundle] pathForResource:@«btn»ofType:@«caf»];
    NSURL *url = [NSURLfileURLWithPath:path isDirectory:NO];
    SystemSoundID id;
    OSStatus res = AudioServicesCreateSystemSoundID((CFURLRef)url, &amp;id);
    if (res == kAudioServicesNoError) {
        self.btnClickId = id;
}

}

Reproducir el sonido

-(IBAction) playClic: (id) sender{

    AudioServicesPlaySystemSound(self.btnClickId);
}

Recuerda que luego habrá que llamar a AudioServicesDisposeSystemSoundID() para liberar recursos.

Reproducir un sonido largo en iOS

Lo primero es añadir las siguientes frameworks a tu proyecto:

  • AVFoundation
  • MediaPlayer
luego haz un #import <AVFoundation/AVAudioPlayer.h>
(IBAction) playLongSound: (id) sender{
    NSString *filePath = [[NSBundlemainBundle] pathForResource:@«beach_waves»ofType:@«aifc»];
    NSError *err = nil;
    NSData *soundData = [[NSDataalloc] initWithContentsOfFile:filePath options:NSDataReadingMappederror:&amp;err];
    AVAudioPlayer *p = [[AVAudioPlayeralloc] initWithData:soundData error:&amp;err];
    self.player = p;
    self.player.numberOfLoops = 1;
    [self.playerplay];}
Todos estos ejemplos suponen que los archivos de sonido han sido previamente añadidos a tu proyecto.

Donde obtener sonidos

Un excelente lugar para buscar sonidos bajo licencia Creative Commons es Freesound.

Gracias al blog de Cocoa Mental. Vuelvo a poner su direccion:

 http://www.cocoaosx.com/2011/06/20/como-reproducir-sonidos-en-ios/

Un saludo!!!

añadir un framework en xcode 4

Vamos a hacer una entrada sencilla, para ver o recordar como añadir un framework a nuestro proyecto en XCODE 4

Mejor una imagen que mil palabras!!!:

  1. En el navegador de proyecto (“project navigator”), selecciona tu proyecto.
  2. Selecciona el objetivo (“target”)
  3. Selecciona la pestaña “Build Phases”.
  4. Abre la sección “Link binaries with libraries”
  5. Haz clic en el botón “+”
  6. Selecciona tu framework
  7. Arrastra la framework  que acaba de añadirse a tu proyecto al grupo de “Frameworks” (opcional).

Un saludo!!!

Aprendiendo Objetive-C para IOS (Dia 27)

Guion del blog de curso de Objetive-C para IOS – DIA 27
—————————————————————————–
Después de unos dias… volvemos a la carga con XCODE!!!
Vamos a ver esta vez, como crearnos una nueva vista, usando un scrollview, y metiendo una imagen, pero esta vez, queremos poder hacer zoom a la imagen, asi como arrastrar el dedo por la pantalla, y cambiar la ubicacion del archivo de imagen.

Voy a usar un mapa grande de la serie «Juego de Tronos», que quiero utilizar proximamente en una aplicacion que tengo creada, y que estoy trabajando para actualizarla.
Creamos pues un nuevo proyecto de tipo single view como siempre, y creamos en la vista un UIScrollView
A continuacion, creamos una nueva clase, que sera una subclass de UIViewController, y la llamamos imagenViewController.
Por ultimo, vamos a las propiedades en el storyboard de nuestra vista, y le decimos que la clase es la de nuestro imagenViewController.
Hacemos el outlet de nuestro scrollView, y lo llamamos directamente scrollView
Importamos ahora la imagen del mapa, arrastrando el archivo de imagen a nuestro xcode. La llamaremos image1.jpg
Hasta aqui, solo hemos preparado nuestro proyecto. Vamos ahora con la programacion.
Hay que tener en cuenta, que tengo que arreglarmelas para que la imagen responda ante diferentes gestos del usuario, ya que queremos poder hacer zoom, o poder desplazar la imagen de un lado a otro.
Para eso, me creo una nueva clase que sera una subclase de UIImageView, a la que le daremos las diferentes caracteristicas para que responda ante los TAP del usuario. He usado un codigo de Apple, que esta en su pagina web, y lo he modificado un poquito para nuestros propositos. La clase se llamara TapDetectingImageView
Veamos como quedan los archivos de dicha clase (Fijaos en la explicacion de los comentarios
————-
TapDetectingImageView.h:
————————
@protocol TapDetectingImageViewDelegate;
@interface TapDetectingImageView : UIImageView {
    
    // Variables que agregamos a nuestra clase, para poder detectar los posibles toques.
    CGPoint tapLocation;         // Necesarios para guardar las cordenadas cuando se le da un toque a la pantalla
    BOOL multipleTouches;        // estara puesto a YES, si se le da mas de un toque
    BOOL twoFingerTapIsPossible; // Estara establecido a NO cuando se puedan usar dos toques.
    
}
@property (nonatomic, weak) id <TapDetectingImageViewDelegate> delegate;
@end
/*
 Vamos a definir ahora el protocolo necesario para que la aplicacion responda antes los toques del usuario.
 Implementaremos varios metodos, segun sea nuestro caso.
 */
@protocol TapDetectingImageViewDelegate <NSObject>
@optional
//En el caso de un simple toque
– (void)tapDetectingImageView:(TapDetectingImageView *)view gotSingleTapAtPoint:(CGPoint)tapPoint;
//En el caso de dos toques
– (void)tapDetectingImageView:(TapDetectingImageView *)view gotDoubleTapAtPoint:(CGPoint)tapPoint;
//En el caso de pellizcar la pantalla
– (void)tapDetectingImageView:(TapDetectingImageView *)view gotTwoFingerTapAtPoint:(CGPoint)tapPoint;
@end
————-
TapDetectingImageView.m:
————————
#import «TapDetectingImageView.h»
@implementation TapDetectingImageView
@synthesize delegate;
– (id)initWithImage:(UIImage *)image {
    self = [super initWithImage:image];
    if (self) {
        [self setUserInteractionEnabled:YES];
        
        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
        UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
        UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap:)];
        
        [doubleTap setNumberOfTapsRequired:2];
        [twoFingerTap setNumberOfTouchesRequired:2];
        
        [self addGestureRecognizer:singleTap];
        [self addGestureRecognizer:doubleTap];
        [self addGestureRecognizer:twoFingerTap];
        
        //SI USAMOS ARC, tenemos que tapar estar lineas, sino las DESTAPAMOS
        //[singleTap release];
        //[doubleTap release];
        //[twoFingerTap release];
    }
    return self;
}
#pragma mark Private
– (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
    if ([delegate respondsToSelector:@selector(tapDetectingImageView:gotSingleTapAtPoint:)])
        [delegate tapDetectingImageView:self gotSingleTapAtPoint:[gestureRecognizer locationInView:self]];
}
– (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {
    if ([delegate respondsToSelector:@selector(tapDetectingImageView:gotDoubleTapAtPoint:)])
        [delegate tapDetectingImageView:self gotDoubleTapAtPoint:[gestureRecognizer locationInView:self]];
}
    
– (void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer {
    if ([delegate respondsToSelector:@selector(tapDetectingImageView:gotTwoFingerTapAtPoint:)])
        [delegate tapDetectingImageView:self gotTwoFingerTapAtPoint:[gestureRecognizer locationInView:self]];
}
    
@end
————-
Ya tenemos creado el archivo necesario para realizar la deteccion de los toques. Vamos ahora con nuestro archivo principal, llamado imageViewController.
————-
//
//  imagenViewController.h
//  Diario027
//
//  Created by david fraj blesa on 06/07/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
//Vemos que establecemos el protocolo UIScrollViewDelegate en la definicion, asi nos obligamos a implementar sus metodos si fuera necesarios
@interface imagenViewController : UIViewController<UIScrollViewDelegate>
//Conectamos el scrollview (Lo hemos realizado directamente, arrastrando con el raton hasta aqui)
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
//Creamos una variable de imagen
@property (retain, nonatomicUIImageView *image;
//Establecemos el metodo que cambiara el tamaño. Acordaos que esto es solo la definicion
– (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center ;
@end
————-
//
//  imagenViewController.m
//  Diario027
//
//  Created by david fraj blesa on 06/07/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «imagenViewController.h»
//Debemos importar el archivo TapDetectingImageView.h, para poder usar los gestos
#import «TapDetectingImageView.h»  
//Definimos una CONSTANTE, para cambiar la velocidad del ZOOM
#define ZOOM_STEP 1.5
@implementation imagenViewController
//Hacemos el synthesize de scrollView(Nuestro scroll) y de image(nuestra imagen), para tener asi los getter y los setters.
@synthesize scrollView;
@synthesize image;
– (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];
}
*/
– (void)viewDidUnload
{
    //Cuando la vista de descargue, establecemos esto a nil
    [self setScrollView:nil];
    [self setImage:nil];
    
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
– (void)viewDidLoad {  
    [super viewDidLoad];  
    
    //Cuando carguemos la VIEW, establecemos diferentes parametros de scrollView
    scrollView.bouncesZoom = YES;  
    scrollView.delegate = self;  
    scrollView.clipsToBounds = YES;  
    
    //Creamos la imagen, y le asignamos el mapa.
    image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@»image1.jpg»]];  
    image.userInteractionEnabled = YES;  
    image.autoresizingMask = ( UIViewAutoresizingFlexibleWidth );  
    
    //Añadimos dicha imagen a nuestro scrollView
    [scrollView addSubview:image];  
    
    //Establecemos el tamaño del contenido
    scrollView.contentSize = [image frame].size;  
    
    // añadimos el reconocedor de gestos a la imagen
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];  
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];  
    UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap:)];  
    
    [doubleTap setNumberOfTapsRequired:2];  
    [twoFingerTap setNumberOfTouchesRequired:2];  
    
    [image addGestureRecognizer:singleTap];  
    [image addGestureRecognizer:doubleTap];  
    [image addGestureRecognizer:twoFingerTap];  
    
    //Si estamos usando ARC, tenemos que tener esto tapado, tal como esta aqui
    //[singleTap release];  
    //[doubleTap release];  
    //[twoFingerTap release];  
    
    // Calculamos la escala minima, para fijar la anchura de la imagen, y empezar a escalarla  
     float minimumScale=[scrollView frame].size.width/[image frame].size.width;
     
    //imageScrollView.maximumZoomScale = 1.0;  
    scrollView.minimumZoomScale = minimumScale;  
    scrollView.zoomScale = minimumScale;  
}  
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {  
    // Le ponemos return YES, para que soporte el cambio de orientacion 
    return YES;  
}  
#pragma mark UIScrollViewDelegate methods  
– (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {  
    return image;  
}  
#pragma mark TapDetectingImageViewDelegate methods  
//Que pasa si slo le damos una vez
– (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {  
    // al darle solo una vez, no hacemos nada.  
}  
//Que pasa si le damos dos veces
– (void)handleDoubleTap:(UIGestureRecognizer *)gestureRecognizer {  
    // Hacemos zoom
    float newScale = [scrollView zoomScale] * ZOOM_STEP;  
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];  
    [scrollView zoomToRect:zoomRect animated:YES];  
}  
//Que pasa si pellizcamos
– (void)handleTwoFingerTap:(UIGestureRecognizer *)gestureRecognizer {  
    // Al pellizcar la pantalla 
    float newScale = [scrollView zoomScale] / ZOOM_STEP;  
    CGRect zoomRect = [self zoomRectForScale:newScale withCenter:[gestureRecognizer locationInView:gestureRecognizer.view]];  
    [scrollView zoomToRect:zoomRect animated:YES];  
}  
#pragma mark Utility methods  
//Metodo para reescalar
– (CGRect)zoomRectForScale:(float)scale withCenter:(CGPoint)center {  
    
    CGRect zoomRect;  
    
    //Como estamos recibiendo la nueva escala, la usamos para establecer el nuevo rectangulo, que hara el papel de zoom
    zoomRect.size.height = [scrollView frame].size.height / scale;  
    zoomRect.size.width  = [scrollView frame].size.width  / scale;  
    
    // Elegimos el origen correcto, que sera el centro de la pantalla 
    zoomRect.origin.x    = center.x – (zoomRect.size.width  / 2.0);  
    zoomRect.origin.y    = center.y – (zoomRect.size.height / 2.0);  
    
    return zoomRect;  
}  
@end
————-
He comentado todo el codigo para explicar lo que se hace en cada apartado.
Parte del codigo lo he recogido de esta pagina web
Lo malo que en esta web, esta todo en Ingles, y esta programado para la version anterior de XCODE, asi que he tenido que retocarlo un poco, para poder usar asi el ARC
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 26)

Guion del blog de curso de Objetive-C para IOS – DIA 26
—————————————————————————–
Vamos a ver como podemos crear una nueva vista con una imagen que podamos mover usando un ScrollView. Para eso. Necesitaremos una imagen lo suficientemente grande para poder interactuar con ella, y movernos asi a base de arrastrar por la pantalla.

Creamos un nuevo proyecto del tpo Single View Controller.
Agregamos al proyecto un nuevo UIImage.

Con el UIImage seleccionado, podemos ir a editor-> Embed IN-> Scroll View
De esta forma, ya tenemos metida la imagen en el scrollView.
Una vez hecho esto, vamos a centra la imagen de forma adecuada en el scrollview, tal como vemos en la imagen
Tambien le damos la posicion correcta de coordenadas al scrollview, y luego cambiamos el tamaño de este mismo, para que ocupe toda nuestra pantalla
Establecemos el zoom del scrollviewcontroller

Y ampliamos nuestro scrollview, hasta que ocupe toda la pantalla

Una vez hecho esto, tenemos que crear una nueva clase, basandonos en ViewController. Le pongo de nombre miViewController, y desde el storyboard, establezco la clase de mi vista, a miViewController, desde el Identifier

Una vez hecho esto, creamos los outlets en el archivo miViewController.h, de la imagen, y del scrollview, quedando el archivo asi:

//
//  miViewController.h
//  Diario026
//
//  Created by david fraj blesa on 02/07/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface miViewController : UIViewController<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
———————–
Una vez que tenemos lo outlets, nos habra creado automaticamente los synthesize en el archivo miViewCOntroller.m
En ese archivo, buscamos el metodo viewDidLoad, y sustituimos las lineas tapadas por el codigo siguiente.
————————
– (void)viewDidLoad
{
    [super viewDidLoad];
    
//Le decimos que el delegado del scrollView es el mismo miViewController
    self.scrollView.delegate = self;
//Establecemos que el tamaño del scrollview, es el tamaño de la imagen
    self.scrollView.contentSize = self.imageView.image.size;
//Dibujamos la imagen
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
}
-(UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    // Le decimos que vista queremos hacer zoom.
    return self.imageView;
}
————-
Compilamos y ejecutamos, asi que deberia ya funcionar todo.
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 25)

Guion del blog de curso de Objetive-C para IOS – DIA 25
—————————————————————————–
CREANDO UNA APLICACION COMPLETA, Y SUBIENDOLA AL APPSTORE PARTE 7 (FINAL):

Hoy terminamos  de subir la aplicacion al appstore, asi que en estas siete partes dentro del diario, vemos el proceso completo para crear una aplicacion desde cero, hasta subirla al appstore.

Vamos a ello….

Le damos a añadir aplicacion desde nuestro itunes connect, y le decimos fecha de publicacion, asi como tier de precio que le queremos dar. En mi caso elijo FREE.

 Me dira que le ponga informacion sobre la Version, copyright, categoria y subcategoria.

Contestamos diversas preguntas, para darle un ratio de edad a la aplicacion, asi como le ponemos una descripion, unas palablas clave, una direccion de correo y una direccion web de soporte.

Tenemos que subir un icono de la aplicacion de 512×512, y alguna captura del producto en resoluciones de 640×960 por ejemplo.

Guardamos los cambios y vemos un resumen. Le damos aVIEW DETAILS

Ya esta todo listo, asi que le damos a READY TO UPLOAD BINARY, para darle a conocer que estamos preparados para subir la aplciacion

Vamos a Xcode, y desde Build Settings, cambiamos el code signing a DISTRIBUTION, para firmar la aplicacion con nuestro certificado vajado el dia anterior.
 
Vamos al menu product, y elegimos build for -> Buid for archiving

Vamos a producto -> ARCHIVE

Nos llevara al organizador, y debemos pulsar en VALIDATE.

Escribimos nuestras credenciales de usuario y clave y pinchamos en NEXT

Pinchamos de nuevo a NEXT

Tenemos que decirle en este paso, si nuestra aplicacion tiene algo de criptografia. Decimos que no y SAVE

Pinchamos en CONTINUE

Nos dice que todo correcto, asi que pinchamos en finish.

 Una vez que esta en STATUS PASSED VALIDATION, elegimos SUBMIT

 Pinchamos en NEXT para ir al paso siguiente

Aparecera la barra de progreso, como que esta subiendo la aplicacion. Una vez que este subida la apliacion, aparecera como que ha sido subida con exito, y esta lista para revision.


Ahora a esperar una semanita, a ver si apple nos aprueba la aplicacion.

Espero que haya sido de ayuda.

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 24)

Guion del blog de curso de Objetive-C para IOS – DIA 24
—————————————————————————–
CREANDO UNA APLICACION COMPLETA, Y SUBIENDOLA AL APPSTORE PARTE 6:

Vamos a ver como crear y descargar los certificados necesarios, para probar nuestra aplicacion en nuestro mobil, y dejarla preparada para poder subirla al appstore

Nos conectamos desde la web de desarrollador de apple

 Vamos al apartado IOS PROVISIONING PORTAL, y creamos un nuevo APP ID:

 Rellenamos la informacion, tal como el nombre de la aplicacion, asi como un Bundle Unico:

Vamos al apartado provisioning, y creamos un nuevo certificado para desarrollo:

Le ponemos un nombre. Como es un nombre para pruebas, yo siempre le pongo la palabra detras de BETA, de esa manera se que es de pruebas para desarrollo.

Eligo el certificado para firmar y el appid creado anteriormente.

Le digo tambien bajo que dispositivo probare.

Una vez creado, lo descargo pinchando en download.

Y doble click para instalarlo!!

Repito el proceso para Distribucion. Aqui no me dira que elija el dispositivo, ya que sera para el app store

Si el nombre de mi aplicacion es demasiado grande, puedo cambiarlo desde la propiedad dentro del apartado INFO de Bundle display name:

 Y eso es todo por hoy!!! mañana veremos como subir la aplicacion definitivamente al appstore!

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 23)

Guion del blog de curso de Objetive-C para IOS – DIA 23
—————————————————————————–
CREANDO UNA APLICACION COMPLETA, Y SUBIENDOLA AL APPSTORE PARTE 5:
Vamos a ver ahora como podemos agregarle un poco de publicidad a nuestra aplicacion. Para esto, tenemos que irnos al storyboard, y añadimos los iAds arrastrando y soltando.
Asi de facil??? Pues aun tenemos que hacer ciertas cosillas…..

Tenemos que agregar a nuestra aplicacion, el framework correspondiente para poder usar iads, ya que sino la aplicacion no funcionaria, ya que no 
encontraria las librerias adecuadas.
Seguimos los siguientes pasos.

Vamos a nuestra pestaña principal del proyecto, y vamos a BUILD PHASES
elegimos la linea de «LINK BINARY WITH LIBRARIES»
Pulsamos el boton +, y añadimos la libreria iAd.framework

Una vez echo esto, vamos a los archivos .h siguientes:
principalViewCOntroller.h, intruccionesViewCOntroller.h y informeViewController.h, e importamos las librerias mediante:
#import <iAd/iAd.h>
Ademas de importarlo, vamos a agregar el protocolo, a cada uno de los interfaces, de manera que tenemos que añadir el protocolo <ADBannerViewDelegate> a 
los archivos principalViewCOntroller.h, intruccionesViewCOntroller.h y informeViewController.h
Por ejemplo, en principalViewController.h sustituimos esto:
@interface principalViewController : UIViewController{ 
por esto otro
@interface principalViewController : UIViewController<ADBannerViewDelegate>{
NOTA: Lo mismo en instruccionesViewCOntroller.h y informeViewCOntroller.h
————-
Una vez terminada la publicidad, solo nos queda añadir a nuestro proyecto los iconos y las imagenes iniciales de nuestra aplicacion. Para eso necesitamos 5 imagenes
Para Icono: Imagen de 57×57
Para Icono Retina: Imagen de 114×114
Para Imagen Inicial: Imagen 320×480
Para imagen Inicial Retina: Imagen de 640×960
Para ICono de Appstore (Se usara mas adelante): Imagen de 512×512
————-
Cuando tengamos las imagenes, vamos a nuestra pantalla inicial del proyecto, y lo unico que hacemos es arrastrar cada imagen a su sitio

Y eso es todo por hoy!!!
Mañana repasaremos como crear los certificados para desarrollo y distribucion, y probaremos nuestra aplicacion en nuestro iphone!
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 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.
————-