PRIMER CONTACTO CON EL ENTORNO DE DESARROLLO Luis Montesano INDICE PARA HOY • ¿Que vamos a aprender en este curso? • Introducción a los conceptos básicos • Programación • Modelo MVC (Model-View-Controller) • Introducción al entorno de desarrollo e instalación en los ordenadores • Hello world para el iPhone • Objective C (si nos da tiempo) OBJETIVOS DEL CURSO • Desarrollar aplicaciones para smartphones, en particular, para el iPhone • Programación orientada a objetos, algún concepto de ingeniería del software • Hablaremos de algunos otros conceptos y su uso en teléfonos inteligentes: • Manejo de sensores • Prestaciones en sistemas embebidos • Bases de datos, servicios web OBJETIVOS ESTA SEMANA • Aprender o recordar conceptos de programación orientada a objetos a través de Objective C • Aprender el modelo básico de desarrollo en el iPhone • Aprender a usar el entorno de desarrollo • • Depurador • Documentación Implementar vuestra primera aplicación • No va a ser “cool” (no tiene acceso a web, fotos, gps ...) • Pensada para aprender a organizar la información y programar correctamente EL CUADERNO DEL PROFESOR AL IPHONE CONCEPTOS BÁSICOS • Experiencia programando? • Programación imperativa • C, ADA, Pascal, matlab... • Programación orientada a objetos • JAVA, C++,... CONCEPTOS BÁSICOS • Programación orientada a objetos: • Clase: un patrón para un objeto • Instancia u objeto • Mensaje: información enviada a un objeto • Método: código que responde a un mensaje • Herencia: estructura jerárquica de relación entre clases (y objetos) • Subclase, superclase • Herencia de funcionalidades entre clases • Variable: almacenamiento de cada instancia (e.g. puntero a otro objeto) • Protocolo (o Interfaz): conjunto de mensajes a los que un objeto responde PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } Nombre de la clase / Superclase -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } Nombre de la clase / Superclase Atributos -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> Include (resuelve las dependencias ciclicas) @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSNumber *age; ! } -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } Métodos -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } Métodos -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end -(void)setAge:(NSNumber *)age; El método no tiene un nombre explícito. Se identifica solo por los argumentos. En este caso, el método tiene un solo argumento de tipo NSNumber * y llamado fname PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } Métodos -(void)setAge:(NSNumber *)myAge; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years; PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } -(void)setAge:(NSNumber *)myAge; -(NSNumber *)getAge; -(void)setSurname:(NSString *)sname; -(NSString *)getSurname; -(void)setName:(NSNumber *)fname; -(NSNumber *)setSurname; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import <Foundation/Foundation.h> @interface Student : NSObject { ! NSString *name; ! NSString *surname; ! NSInteger *age; ! } -(void)setAge:(NSNumber *)myAge; -(NSNumber *)getAge; -(void)setSurname:(NSString *)sname; -(NSString *)getSurname; Funciones de lectura y escriturar para los atributos -(void)setName:(NSNumber *)fname; -(NSNumber *)setSurname; -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years @end PRIMERA CLASE DE OBJECTIVE C #import "Alumno.h" @implementation Student //@synthesize name, surname, age, repeats, type,photo; -(void)setAge:(NSInteger *)myAge{ ! age=myAge; } -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years Type:(NSString *)ctype{ ! ! // Implementación de la inicialización ! [objeto mensaje:argumento] [fname capitalize] // Poner en mayúsculas return self; } -(void)dealloc { ! // Más adelante } @end PRIMERA CLASE DE OBJECTIVE C #import "Alumno.h” @implementation Student @synthesize name, surname, age, repeats, type,photo; -(void)setAge:(NSInteger *)myAge{ ! age=myAge; } -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years Type:(NSString *)ctype{ ! ! // Implementación de la inicialización ! [objeto mensaje:argumento] [fname capitalize] // Poner en mayúsculas return self; } -(void)dealloc { ! // Más adelante } @end PRIMERA CLASE DE OBJECTIVE C #import "Alumno.h" @implementation Student @synthesize name, surname, age, repeats, type,photo; -(void)setAge:(NSInteger *)myAge{ ! age=myAge; } -(id)initWithName:(NSString *)fname Surname:(NSString *)sname Age: (NSInteger*)years Type:(NSString *)ctype{ ! ! // Implementación de la inicialización ! [objeto mensaje:argumento] [fname capitalize] // Poner en mayúsculas return self; } -(void)dealloc { ! // Más adelante } @end ¿QUE HACEMOS CON EL ALUMNO? • Tenemos el? • Crear • Ver un alumno en el iPhone, ¿qué podemos hacer con un interfaz de usuario para: su información • Modificar su edad MODELO VISTA CONTROLADOR Controlador Modelo Vista MODELO VISTA CONTROLADOR Controlador Modelo Vista El modelo MVC separa la información de su representación, a través de un controlador UN EJEMPLO SENCILLO: VISOR DE ALUMNOS ? Controlador Modelo Vista Clase Alumno ? IB: INTERFACE BUILDER IB: INTERFACE BUILDER Arrastrar IB: INTERFACE BUILDER IB: INTERFACE BUILDER DEMO Instalar SDK para el iPhone UN EJEMPLO SENCILLO: VISOR DE ALUMNOS ? Controlador Modelo Vista Clase Alumno Interfaz creado por IB EL PRIMER CONTROLADOR #import <UIKit/UIKit.h> #import ”Alumno.h” @interface MyViewController : UIViewController { ! // Vista IBOUTLET UITextField *textField; ! IBOUTLET UILabel *label; // Model (datos) Alumno *name; } - (IBAction)showName:(id)sender; @end EL PRIMER CONTROLADOR UIKit.h contiene UIViewController, la clase que da soporte a MVC #import <UIKit/UIKit.h> #import ”Alumno.h” @interface MyViewController : UIViewController { ! // Vista IBOUTLET UITextField *textField; ! IBOUTLET UILabel *label; // Model (datos) Alumno *name; } - (IBAction)showName:(id)sender; @end EL PRIMER CONTROLADOR #import <UIKit/UIKit.h> #import ”Alumno.h” Nuestro controlador va a usar nuestro modelo de datos @interface MyViewController : UIViewController { ! // Vista IBOUTLET UITextField *textField; ! IBOUTLET UILabel *label; // Model (datos) Alumno *name; } - (IBAction)showName:(id)sender; @end EL PRIMER CONTROLADOR #import <UIKit/UIKit.h> #import ”Alumno.h” @interface MyViewController : UIViewController { ! // Vista IBOUTLET UITextField *textField; ! IBOUTLET UILabel *label; // Model (datos) Alumno *name; } - (IBAction)changeAge:(id)sender; @end UNA APLICACIÓN SIMPLE COMPLETAR DEMO