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!!!

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

Aprendiendo Objetive-C para IOS (Dia 13)

Guion del blog de curso de Objetive-C para IOS – DIA 13
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.

————-
 Seguimos con el Storyboard. Iniciamos un proyecto tipo SINGLE-VIEW como en otros dias, y activamos storyboard y ARC.

Vamos al archivo storyboard, y borramos el view controller creado por defecto.

Arrastramos un NAVIGATION VIEW CONTROLLER

Agregamos 2 VIEW CONTROLLERs

Creamos dos botones que serviran para poder navegar a uno u otro view controller

 

Vamos a arrastrar pulsando la tecla CTRL al primer view controller

IMPORTANTE!! para que aparezca automaticamente, el boton de navegacion para volver, elegimos PUSH en el SEGUE

Hacemos lo mismo con la otra vista, tal y como sale en las imagenes:

 

Podemos cambiar el fondo de los view controllers, asi como añadirle etiquetas, eso si SOLO SI esta en modo Zoom Normal.

Y ya hemos terminado de momento!!

A partir de ahora, mas codigo y menos imagenes!!! jeje.

Un saludo a todos!!

Aprendiendo Objetive-C para IOS (Dia 12)

Guion del blog de curso de Objetive-C para IOS – DIA 12
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.
————-

Seguimos con los Storyboards, y esta vez vamos a ver como podemos crearnos un interface, basado en Tab View Controllers.

Creamos un nuevo proyecto usando storyboards y arc, y elegimos de nuevo single-view

En el archivo storyboard, vemos como tenemos un unico ViewController (justo lo que hemos elegido)

Lo eliminamos son la tecla SUPR, y arrastramos un TAB View Controller.

Nos aparecera un Tab View controller, con dos view controller ya enlazadas y con sus pestañas. Vamos a ver como agregar mas, para ver el funcionamiento.

Arrastramos un nuevo View Controller

Mantenemos pulsado la tecla CTRL, y arrastramos desde nuestro TAB BAR COntroller, hasta el nuevo view controller.


Para que lo enlace todo de forma automatica, elegimos Relationship – viewControllers

De esta forma podemos crearnos todos los TABs que queramos

Si queremos cambiar el orden de los Tabs, podemos hacerlo directamente en el Tab Bar Controller, arrastrandolos para cambiar de orden.

Si queremos cambiar el nombre de los items, asi como la imagen, tenemos que hacerlo en cada View Controller.

Eso es todo de momento!!!

Aprendiendo Objetive-C para IOS (Dia 11)

Guion del blog de curso de Objetive-C para IOS – DIA 11
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 investigar un poco sobre como funciona el nuevo modelo de xcode 4, llamado storyboard. Para crear un proyecto con storyboard, necesitamos activar storyboard al crear el proyecto. Para poder ver el funcionamiento, Creamos un nuevo proyecto, y marcamos la casilla storyboard y ARC. Elegiremos Single-view

 Vamos a ver lo sencillo que es crear un proceso de navegacion con storyboard entre pantallas.
Veremos que se nos ha creado un primer VIEW CONTROLLER. Desde el menu de objetos, podemos arrastrar a nuestro storyboard todos los VIEW CONTROLLER que queramos.
Podria quedar asi de esta forma:

Podemos arrastrar un boton al primer view controller como siempre. Para que al pulsar en el boton, y nos lleve a otro view Controller, podemos simplemente arrastrar manteniendo pulsado la tecla CTRL, y arrastrar a la vista que queramos abrir.

Aparecera un mensaje que nos dara a elegir el tipo de transicion «SEGUE». Elegimos MODAL

Pinchamos en el dibujo del SEGUE, y nos dara a elegir las diferentes transiciones posibles.

Podemos jugar ahora con las diferentes transiciones que nos permite, creando diferentes VIEW CONTROLLER.


 Y todo sin escribir una sola linea de codigo!!!!

Habra que seguir investigando a ver que mas posibilidades tenemos!!

Un saludo!!!

Aprendiendo Objetive-C para IOS (Dia 10)

Guion del blog de curso de Objetive-C para IOS – DIA 10
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 crear un UITableView en nuestro proyecto. Para eso, hacemos como siempre un nuevo proyecto, que tenga una single view, y añadimos a dicho proyecto un TableView desde el interface builder.

Una vez echo esto, asignamos los 2 outlets de la tabla, a nuestro FilesOwner, tal como nuestra la imagen
————
Hacemos el outlet de dicha tabla en nuestro archivo ViewController.h, y nos creamos también un vector para guardar los diferentes elementos que queremos tener en nuestra tabla.
El archivo ViewController.h quedara así:
//
//  ViewController.h
//  Diario010
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>{
    
    //Creamos un array Mutable, para guardar un listado.
    NSMutableArray *listado;
    
}
@property (retain, nonatomic) IBOutlet UITableView *tableListado;
@end
Fijaos en estas lineas:
@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>{
Aquí nos estamos comprometiendo, mediante los dos protocolos UITableViewDelegateUITableViewDataSource, que implementaremos los métodos obligatorios que dictan dichos protocolos, como ya nos paso en el PickerView
Dicha implementación la haremos en el archivo ViewController.m, quedando el código así:
//
//  ViewController.m
//  Diario010
//
//  Created by david fraj blesa on 14/06/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import «ViewController.h»
@implementation ViewController
@synthesize tableListado;
– (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.
    
    //Inicializamos el vector que tendrá todos los objetos, y le damos elementos
    listado=[[NSMutableArray alloc] initWithObjects:@»Zaragoza», @»Huesca», @»Teruel», nil];
    
    //Podemos añadir asi
    [listado addObject:@»Valencia»];
    [listado addObject:@»Alicante»];
    
    //O podemos añadir con un bucle
    for(int i=0; i<10;i++){
        [listado addObject:[NSString stringWithFormat:@»Ciudad %i», i]];
    }
    
    
    
    
}
////////////////////
// COMO NOS HEMOS COMPROMETIDO, MEDIANTE LOS PROTOCOLOS 
//<UITableViewDelegate, UITableViewDataSource>, tenemos que 
//implementar los siguientes metodos, para poder hacer funcionar nuestra tabla
//Esto tambien pasaba cuando vimos el UIPickerView, y volvera a pasar
//Mas adelante con los map View por ejemplo
//Metodo para establecer el titulo de la tabla
-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return @»Titulo de tabla»;
}
//Metodo para establecer el pie de la tabla
-(NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    return @»Pie de la tabla»;
}
//Necesitamos decirle como llenar la tabla. Devolvera la celda 
– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    //En todos los ejemplos ponen la palabra static, pero no hace falta
    NSString *CellIdentifier = @»Cell»;
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
   
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    
    // Configuramos la celda
    cell.textLabel.text = [listado objectAtIndex:indexPath.row];
    //Vamos a ponerle una imagen a la celda
    //Creamos un objeto de imagen, llamado icono
    UIImage *icono=[UIImage imageNamed:@»icono.jpg»];
    
    //Asignamos el objeto imagen llamado icono, a la celda
    cell.imageView.image=icono;
    
    //Devuelvo la celda
    return cell;
    
}
//Debemos decirle cuantos elementos tenemos
//llamaremos al metodo count de nuestro vector
-(NSInteger )tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [listado count];
}
//Vamos a implementar ahora, el metodo para que nos saque un UIAlertView, cuando pulsemos en uno de los elementos
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    //Creamos un string para recoger lo que se mostrara
    NSString *texto=[listado objectAtIndex:[indexPath row]];
    
    //Creamos el alert
    UIAlertView *alerta=[[UIAlertView alloc] initWithTitle:@»Elemento seleccionado» message:texto delegate:self cancelButtonTitle:@»OK» otherButtonTitles: nil];
    
    //mostramos la alerta
    [alerta show];
    
    //liberamos recursos
    [alerta release];
    [texto release];
}
///////////////////
////////////////////////////////////
/////////////////////////////////////////////////
– (void)viewDidUnload
{
    [self setTableListado:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
– (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}
– (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}
– (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
– (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
– (void)dealloc {
    [tableListado release];
    [super dealloc];
}
@end
———————-
Nota: La imagen que ponemos en cada celda, tiene que agregarse al proyecto

Aprendiendo Objetive-C para IOS (Dia 9)

Guion del blog de curso de Objetive-C para IOS – DIA 9
nota: Esto es no es curso propiamente dicho, es un diario de autoaprendizaje de objetive-c, que me sirve para afianzar conocimientos, y de paso, tener un diario de referencia, con ejemplos propios de uso del lenguaje.
————-
Vamos a ver como se puede utilizar un NSTimer, para realizar diferentes acciones. Por ejemplo, el crear un contador, o el mover un objeto por la pantalla.

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

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

Aprendiendo Objetive-C para IOS (Dia 8)

Guion del blog de curso de Objetive-C para IOS – DIA 8
nota: Esto es no es curso propiamente dicho, es un diario de autoaprendizaje de objetive-c, que me sirve para afianzar conocimientos, y de paso, tener un diario de referencia, con ejemplos propios de uso del lenguaje.
————-
Vamos a ver como podemos crear un UIPickerView, cogiendo los datos de un vector, y haciendolo de tal manera que podamos interactuar con el picare, para poder recoger los datos, y mostrarlos o añadirlos a un cuadro de texto.
En primer lugar, creamos un interface con el Builder, con un TextView, un PickerView y 4 Botones.

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

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

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

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

Ver imagen: