appcity 2012 ios principiante dia 1

58
Curso de desarrollo iOS (principiante) sábado 4 de febrero de 12

Upload: erikoterice

Post on 24-Dec-2015

9 views

Category:

Documents


0 download

DESCRIPTION

Apuntes de AppCity 2012 Día 1

TRANSCRIPT

Page 1: AppCity 2012 iOS Principiante Dia 1

Curso de desarrollo iOS(principiante)

sábado 4 de febrero de 12

Page 2: AppCity 2012 iOS Principiante Dia 1

Ricardo [email protected] : @ricardocahe

Miguel José García [email protected] : @miguelgarciacor

PROFESORES

sábado 4 de febrero de 12

Page 3: AppCity 2012 iOS Principiante Dia 1

HORARIO

9:30 - 11:00 11:00 - 11:30 Break11:30 - 13:0013:00 - 14:3014:30 - 15:30 Break15:30 - 17:3017:30 - 18:00 Break18:00 - 19:00

sábado 4 de febrero de 12

Page 4: AppCity 2012 iOS Principiante Dia 1

DÍA 1

A Simple iOS Application Objective-C Managing memory with ARC

sábado 4 de febrero de 12

Page 5: AppCity 2012 iOS Principiante Dia 1

DÍA 2

Delegation and Core Location Mapkit and Text Input Subclassing UIView and UIScrollView View Controllers Notification and Rotation

sábado 4 de febrero de 12

Page 6: AppCity 2012 iOS Principiante Dia 1

DÍA 3

UITableView and UITableViewController Editing UITableView UINavigationController Camera UIPopoverController and Modal View Controllers

sábado 4 de febrero de 12

Page 7: AppCity 2012 iOS Principiante Dia 1

DÍA 4

Saving, Loading, and Multitasking Subclassing UITableViewCell Core Data Localization Settings

sábado 4 de febrero de 12

Page 8: AppCity 2012 iOS Principiante Dia 1

¿QUE VAMOS A APRENDER EN ESTE CURSO?

Cocoa Touch

Cocoa Touch es el API para el desarrollo de aplicaciones orientado a objetos. Esta incluye a su vez 3 frameworks que usaremos para poder trabajar con iOS:

• UIKit, que proporciona todos los elementos gráficos para nuestra aplicación mediante interfaces a su framework.

• Fundation Framework, es el conjunto de clases que utiliza para representar estructuras de datos complejas.

• Address Book UI Framework, nos ayuda a acceder a los datos de nuestros contactos.

Objective-C

Es un lenguaje de programación basado en C, y que ha sido modificado para poder trabajar orientado a objetos, con lo cual puedes crear clases, objetos, variables de instancias, métodos, utilizar encapsulación, etc.

sábado 4 de febrero de 12

Page 9: AppCity 2012 iOS Principiante Dia 1

Mimicry: acción de aprender imitando a alguien o algo Explicación Ejemplo Práctica

¿CÓMO VAMOS A APRENDER??

sábado 4 de febrero de 12

Page 10: AppCity 2012 iOS Principiante Dia 1

1. UNA APLICACIÓN SIMPLE

¿Qué pasa cuando arranca una aplicación iOS? Window - View SDK iOS: librería orientada a objetos. Las ventanas y las

vistas se representan como objetos.

sábado 4 de febrero de 12

Page 11: AppCity 2012 iOS Principiante Dia 1

GESTIÓN DE VISTAS

sábado 4 de febrero de 12

Page 12: AppCity 2012 iOS Principiante Dia 1

CICLO DE VIDA

Delegate Controlador Vista

Inicio

Fin

Boton {Preferencias()}

Inicio {AbrirTitulo()}

AbrirPreferencias() Preferencias()

AbrirTitulo()

sábado 4 de febrero de 12

Page 13: AppCity 2012 iOS Principiante Dia 1

1. PATRÓN MVC

El modelo-vista-controlador es un patrón arquitectónico. Se emplea para estructurar las interfaces de los programas de una manera en la que separamos tareas diferentes en diferentes capas. Por un lado tenemos la presentación, por otro la lógica de aplicación y por otro la información del dominio.

sábado 4 de febrero de 12

Page 14: AppCity 2012 iOS Principiante Dia 1

1. PATRÓN MVC - MODELO

El modelo encapsula los datos específicos de una aplicación y define la lógica y los proceso de computo que manipulan esos datos. Muchos de estos datos son el estado de la parte persistente de la aplicación.

Como los objetos de modelo representan conocimiento y experiencia respecto a un determinado dominio de problema, pueden reusarse en problemas con un dominio similar.

sábado 4 de febrero de 12

Page 15: AppCity 2012 iOS Principiante Dia 1

1. PATRÓN MVC - MODELO

Los objetos de dominio son clases donde almacenamos la información de nuestro programa en tiempo de ejecución. También la lógica que maneja estos datos y que será invocada desde el controlador.

Estas clases no tienen que ser de un tipo concreto, por lo que lo usual es que heredemos de NSObject para crearlas.

sábado 4 de febrero de 12

Page 16: AppCity 2012 iOS Principiante Dia 1

1. PATRÓN MVC - VISTA

Una vista es algo que el usuario ve. Un objeto de tipo vista conoce como pintarse y como responder a las interacciones del usuario. El objetivo principal es representar los datos de los objetos del modelo de dominio.

Por ejemplo cuando tenemos un text field en una vista y lo modificamos, la vista cambiará el objeto de dominio pero sólo a través del controlador.

sábado 4 de febrero de 12

Page 17: AppCity 2012 iOS Principiante Dia 1

1. PATRÓN MVC - VISTA

La vista la crearemos en nuestro fichero.xib. Para la creación de la vista utilizaremos Interface Builder y la construiremos a base de widgets predefinidos del framework Cocoa Touch o a través de widgets propios.

sábado 4 de febrero de 12

Page 18: AppCity 2012 iOS Principiante Dia 1

1. PATRÓN MVC - CONTROLADOR

Un controlador es un objeto que actuá de intermediario entre una o mas vistas de aplicaciones y uno o más modelos de dominio. El controlador es como un conducto a través del cual los objetos se informan del cambio en la interface y viceversa. Los Controladores también pueden ajustar tareas de la aplicación y manejar el ciclo de vida de los objetos.

sábado 4 de febrero de 12

Page 19: AppCity 2012 iOS Principiante Dia 1

1. PATRÓN MVC - CONTROLADOR

El controlador emplea el patrón fachada, actuando como una capa intermedia que aglut ina todas las funcionalidades de dominio, mediante llamadas a estos objetos y que es accesible desde la vista.

Para ello se crean instancias de los objetos de dominio. También los objetos que asociaremos a objetos de la interface y los métodos que se llamaran desde los objetos de la interface.

sábado 4 de febrero de 12

Page 20: AppCity 2012 iOS Principiante Dia 1

1. CREAR UN PROYECTO CON XCODE

HOLA MUNDO

Una buena forma de familiarizarse con los lenguajes de programación y con los entornos de desarrollo es crear una aplicación sencilla que muestre un mensaje en pantalla. Estos pequeños programas se crean usando la frase ‘Hola Mundo’ casi como un estándar, así que manos a la obra.

Abrimos XCode:

sábado 4 de febrero de 12

Page 21: AppCity 2012 iOS Principiante Dia 1

Creamos un nuevo proyecto:

Seleccionamos el tipo de proyecto:

1. CREAR UN PROYECTO CON XCODE

sábado 4 de febrero de 12

Page 22: AppCity 2012 iOS Principiante Dia 1

Elegimos un nombre para el proyecto (HolaMundo).

Añadimos un nuevo fichero al proyecto.

Elegimos UIViewController y seleccionamos la opción “With XIB for user interface”. Nos pedirá un nombre, elegimos MensajeController.

Ahora tenemos que hacer que se abra el XIB que acabamos de crear justo al inicio.

1. CREAR UN PROYECTO CON XCODE

sábado 4 de febrero de 12

Page 23: AppCity 2012 iOS Principiante Dia 1

Abrimos el Interface Builder y añadimos un Label:

1. CREAR EL INTERFAZ

sábado 4 de febrero de 12

Page 24: AppCity 2012 iOS Principiante Dia 1

En el .h del Delegate creamos una referencia a nuestro controlador:

#import <UIKit/UIKit.h>#import "MensajeController.h"

@interface HolaMundoAppDelegate : NSObject <UIApplicationDelegate> { UIWindow *window;! MensajeController *mensajeController;}

@property (nonatomic, retain) IBOutlet UIWindow *window;

@end

1. DECLARACIONES

sábado 4 de febrero de 12

Page 25: AppCity 2012 iOS Principiante Dia 1

Cargamos la vista al cargar la aplicación:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

mensajeController=[[MensajeController alloc]initWithNibName:@"MensajeController" bundle:nil];[window addSubview:mensajeController.view];[self.window makeKeyAndVisible];return YES;

}

1. IMPLEMENTAR MÉTODOS

sábado 4 de febrero de 12

Page 26: AppCity 2012 iOS Principiante Dia 1

En el .h del controlador, creamos la variable que hará referencia al label creado:

#import <UIKit/UIKit.h>

@interface MensajeController : UIViewController {! IBOutlet UILabel *mensaje; IBOutlet UIButton *boton;}

@property (nonatomic, retain) IBOutlet UILabel *mensaje;@property (nonatomic, retain) IBOutlet UIButton *boton;

-(IBAction)saludar:(id)sender;

@end

Para poder acceder a esa variable, en el .m añadimos:

@synthesize mensaje;

1. CONFIGURAR PUNTEROS

sábado 4 de febrero de 12

Page 27: AppCity 2012 iOS Principiante Dia 1

Tenemos que referenciar la variable del Label con el Label del Interface Builder :

1. CONECTORES

sábado 4 de febrero de 12

Page 28: AppCity 2012 iOS Principiante Dia 1

Añadimos un texto cualquiera al label al inicio. Esto se hace en el método saludar del controlador:

- (void)saludar {!! [mensaje setText:@"Hola Mundo"];}

1. CONFIGURAR ACCIONES Y OBJETOS

sábado 4 de febrero de 12

Page 29: AppCity 2012 iOS Principiante Dia 1

Desde el Files Owner, nuestros conectores se deben de quedar configurados de la siguiente manera:

1. RESUMEN DE CONECTORES

sábado 4 de febrero de 12

Page 30: AppCity 2012 iOS Principiante Dia 1

Ya solo queda compilar y arrancar nuestro programa, y si todo ha ido bien, aparecerá el mensaje “Hola Mundo” en el simulador del iPhone al presionar el botón.

1. COMPILAR Y EJECUTAR

sábado 4 de febrero de 12

Page 31: AppCity 2012 iOS Principiante Dia 1

Ahora que sabemos probar nuestra aplicación en el simulador, es hora de probarla en el dispositivo.Necesitamos un certificado de desarrollador.Asignar el Bundle Identifier (App Id): com.atomicflavor.examplePerfil de aprovisionamiento: example.mobileprovision

1. DESPLEGAR LA APLICACIÓN

sábado 4 de febrero de 12

Page 32: AppCity 2012 iOS Principiante Dia 1

1. ICONOS DE LA APLICACIÓN

Es muy importante el diseño del icono, ya que es lo primero que va a ver el posible comprador de la aplicación.

Tamaños: iPhone/iPod Touch sin Retina display: 57x57 pixels iPhone/iPod Touch con Retina display: 114x114 pixels iPad: 72x72 pixels

sábado 4 de febrero de 12

Page 33: AppCity 2012 iOS Principiante Dia 1

1. ICONOS DE LA APLICACIÓN

Para insertar los iconos, arrastramos a:

sábado 4 de febrero de 12

Page 34: AppCity 2012 iOS Principiante Dia 1

Podemos cargar imágenes al arrancar la aplicación.

Tamaños: iPhone/iPod Touch sin Retina display: 320x480 pixels iPhone/iPod Touch con Retina display: 640x960 pixels iPad: 1024x768 pixels

1. CARGAR IMÁGENES

sábado 4 de febrero de 12

Page 35: AppCity 2012 iOS Principiante Dia 1

2. OBJECTIVE-C

Las aplicaciones de iOS se desarrollan en Objective-C

Objective-C es una extensión del lenguaje C

Cocoa Touch son un un conjunto de clases en Objective-C

sábado 4 de febrero de 12

Page 36: AppCity 2012 iOS Principiante Dia 1

2. OBJETOS

Coche

int numRuedas; //Atributo

-(int) getNumRuedas; //Método-(void) setNumRuedas:(int)n;

- Clase: propiedad y comportamiento de un objeto concreto.- Objeto: es una instancia a una clase.- Atributo: propiedad del objeto.- Método: es lo que un objeto puede hacer. Algoritmo.- Evento: interacción del usuario con la máquina.- Mensaje: comunicación dirigida a un objeto ordenándole que ejecute uno de sus métodos.

sábado 4 de febrero de 12

Page 37: AppCity 2012 iOS Principiante Dia 1

2. USAR INSTANCIAS

Como hemos visto, para crear un objeto usamos alloc, esto crea una instancia a ese objeto y reserva memoria.NSMutableArray *listaPersonas = [NSMutableArray alloc];

Pero un objeto para ser usado, necesita que reservemos memoria y esté inicializado, para ello usamos init.[listaPersonas init];

Es muy común usarlos juntos:NSMutableArray *listaPersonas = [[NSMutableArray alloc] init];

sábado 4 de febrero de 12

Page 38: AppCity 2012 iOS Principiante Dia 1

2. ENVIAR MENSAJES

- Mensaje: comunicación dirigida a un objeto ordenándole que ejecute uno de sus métodos.

NSMutableArray *listaPersonas = [[NSMutableArray alloc] init];[listaPersonas addObject:personaX];

sábado 4 de febrero de 12

Page 39: AppCity 2012 iOS Principiante Dia 1

2. DESTRUIR OBJETOS

Para destruir objetos se usa el mensaje release.[listaPersonas release];

Esta instrucción destruye el objeto apuntado por la variable listaPersonas.Aunque hemos destruido la referencia que apunta al objeto, listaPersonas sigue teniendo valor, para limpiarla usamos nil.listaPersonas = nil;

sábado 4 de febrero de 12

Page 40: AppCity 2012 iOS Principiante Dia 1

2. NSSTRING

NSString es una clase de Objective-C usada para representar cadenas.NSString *cadena = @”Hola Mundo”;

No es necesario usar alloc para reservar memoria ya que NSString usa el prefijo @ para hacerlo.

Aunque también se podría hacer:NSString *cadena = [[NSString alloc] initWithString:@”Hola Mundo”];

sábado 4 de febrero de 12

Page 41: AppCity 2012 iOS Principiante Dia 1

2. NSARRAY Y NSMUTABLEARRAY

Un array es una colección de objetos. Es una lista ordenada de objetos a la que se puede acceder a través de un índice.

NSArray una vez que se ha instanciado, no se pueden añadir o borrar objetos.

NSMutableArray, es un array dinámico al que podemos añadir o borrar objetos en cualquier momento.

sábado 4 de febrero de 12

Page 42: AppCity 2012 iOS Principiante Dia 1

2. HEREDAR UNA CLASE

Todas las clases en Objective-C tienen una superclase, excepto NSObject.Una clase hereda el comportamiento de su superclase.

sábado 4 de febrero de 12

Page 43: AppCity 2012 iOS Principiante Dia 1

2. VARIABLES DE INSTANCIA

Cada vez que se crea un objeto, el sistema crea una copia de todas las variables que están vinculadas con dicha clase haciéndolas propias de esa instancia y solamente pudiéndose acceder a ellas a través del identificador del objeto.

@interface Persona : NSObject { NSString *nombre; NSString *dni; int edad;}

@end

sábado 4 de febrero de 12

Page 44: AppCity 2012 iOS Principiante Dia 1

2. MÉTODOS DE ACCESO

Ahora que tenemos nuestras variables de instancia, necesitamos alguna forma de acceder a ellas para darles valor o para obtenerlo.Para ello usamos los métodos de acceso.También llamados getter y setter :

-(NSString *) getNombre{ return nombre;}

-(void) setDni:(NSString *)newDni{ dni = newDni;}

sábado 4 de febrero de 12

Page 45: AppCity 2012 iOS Principiante Dia 1

2. MÉTODOS DE INSTANCIA

Además de los métodos de acceso, tenemos otros métodos que nos ayudan a resolver otras tareas.

Por ejemplo, el método -(bool)validarDni; lo usaremos para validar el dni de un objeto de clase Persona.

Los métodos de instancia se suelen declarar en el .h y se implementan en el .m

sábado 4 de febrero de 12

Page 46: AppCity 2012 iOS Principiante Dia 1

2. INICIALIZADORES

Al principio del capítulo hablamos que con alloc reservamos memoria para una variable y nos devolvía un puntero a esa posición de memoria, y con init inicializamos el objeto.

Coche *miCoche = [[Coche alloc] init];

A veces es necesario crear nuestros propios métodos de inicialización:

Persona *persona = [[Persona alloc] initWithName:@”Pepe” dni:@”111111P”];

-(id)initWithName:(NSString *)nombre dni:(NSString *)dni{ [super init]

self.nombre = nombre;self.dni = dni;

}

sábado 4 de febrero de 12

Page 47: AppCity 2012 iOS Principiante Dia 1

2. INICIALIZADORES

id: representa un puntero a cualquier objeto. Los métodos init se declaran siempre devolviendo el parámetro id.

super: representa a la superclase.

self: es una variable local implícita, apunta al objeto donde se ha declarado.

sábado 4 de febrero de 12

Page 48: AppCity 2012 iOS Principiante Dia 1

2. MÉTODOS DE CLASE

Mientras que los métodos de instancia como init, son enviados a la instancia del objeto, los métodos de clase, como alloc, son enviados directamente a la clase.

Se usan para llamar a un método de una clase sin tener que crear una instancia de ella.

Se declaran con el ‘+’ delante: +(int)calcularEdad;

Se llaman sin crear la instancia:int edad = [Persona calcularEdad];

sábado 4 de febrero de 12

Page 49: AppCity 2012 iOS Principiante Dia 1

2. DESAFIO

Crear un programa que recorra un array de strings y muestre cada elemento con NSLog.

Crea un bug en tu programa, preguntando por una posición de memoria que no existe y contempla el error que se produce.

sábado 4 de febrero de 12

Page 50: AppCity 2012 iOS Principiante Dia 1

3. GESTIÓN DE MEMORIA CON ARC

Es muy importante conocer la gestión de memoria.

Objective-C en iOS al contrario que en mac, no tiene recolector de basura, por lo que seremos nosotros los que nos ocupemos de liberar la memoria.

Dispositivos con poca capacidad de memoria.

Los dos principales problemas son:

- dealloc prematuro- memory leak

sábado 4 de febrero de 12

Page 51: AppCity 2012 iOS Principiante Dia 1

3. GESTIÓN DE MEMORIA CON ARC

ARC: Automatic Reference Counting

Evitamos tener que liberar memoria de forma manual y el tiempo que perdemos buscando memory leaks.

ARC es un paso de pre-compilación que añade retain/release/autorelease sin tener que añadirlo tú.

A pesar de eso, no nos podemos olvidar de la gestión de memoria por completo.

sábado 4 de febrero de 12

Page 52: AppCity 2012 iOS Principiante Dia 1

3. GESTIÓN DE MEMORIA CON ARC

sábado 4 de febrero de 12

Page 53: AppCity 2012 iOS Principiante Dia 1

3. PILA

Cuando creamos un objeto usando alloc/init, a nuestro contador de referencias se le añade un 1:NSObject *obj = [[NSObject alloc] init];

Cuando liberamos el objeto, el contador de referencias vuelve a 0.[obj release];

sábado 4 de febrero de 12

Page 54: AppCity 2012 iOS Principiante Dia 1

3. ARC Y EL TIEMPO DE VIDA DE UN OBJETO

Cuando habilitamos ARC nuestro código queda de la siguiente manera:NSObject *obj = [[NSObject alloc] init];

Esto no significa que el contador de referencias desaparezca, sino que es automático.

Cuando el precompilador considera que el objeto no se va a usar más, añade automáticamente una línea para liberar ese objeto:[obj release];

sábado 4 de febrero de 12

Page 55: AppCity 2012 iOS Principiante Dia 1

3. PROPIEDADES

Antes de ARC, el compilador gestionaba la memoria de las propiedades públicas usando los parámetros de la directiva @property con assign, retain y copy.

Con las propiedades indicamos, si en la asignación de un nuevo valor debía: - liberarse la antigua referencia y retenerse la nueva (retain)- asignarse simplemente (assign), caso de los tipos primitivos (float, int) o estructuras (como NSRect).- o bien el copiado de objetos que nos permite tener un objeto fresco con el valor “congelado” de otro (copy).

Estos parámetros ya no se utilizan en la ARC. En su lugar tenemos los parámetros débil / fuerte para indicar al compilador cómo queremos tratar nuestras propiedades.

sábado 4 de febrero de 12

Page 56: AppCity 2012 iOS Principiante Dia 1

3. REFERENCIAS FUERTES

Se utiliza el atributo strong.

Especifica que hay una relación de propiedad (fuerte) sobre el objeto de destino.

Sin ARC:@property(retain) NSObject *obj;

Con ARC:@property(strong) NSObject *obj;

sábado 4 de febrero de 12

Page 57: AppCity 2012 iOS Principiante Dia 1

3. REFERENCIAS DÉBILES

Se utiliza el atributo weak.

Especifica que hay una relación de no-propiedad (débil) sobre el objeto de destino. Contamos con la ventaja de que si el objeto en cuestión resulta desalojado de la memoria (dealloc), entonces el valor de la propiedad se ajustará automáticamente a nil y, por tanto, en ningún caso se producirá un cuelgue del programa dado que el lenguaje permite enviar mensajes a nil.

@property(weak) NSObject *obj;

sábado 4 de febrero de 12

Page 58: AppCity 2012 iOS Principiante Dia 1

3. @AUTORELEASEPOOL

Otra de las incorporaciones es la correspondiente a la nueva directiva @autoreleasepool, que sustituye la clase NSAutoreleasePool convencional para la gestión de todos aquellos objetos sobre los que se haya aplicado un autorelease.

NSAutoreleasePool es costoso de desarrollar y todo se simplifica a:@autoreleasepool{ código}

Así de simple; y de hecho la documentación de Apple indica que su uso es incluso más eficiente en comparación con la propia clase a la que viene a sustituir.

sábado 4 de febrero de 12