tema6

30
Introducción al desarrollo de aplicaciones en iOS [6.1] ¿Cómo estudiar este tema? [6.2] Targets y productos [6.3] Ficheros de cabecera (interfaces) y de implementación [6.4] Principales características de Objective-C [6.5] Gestión de memoria en Objective-C [6.6] Delegado de aplicación y controlador inicial [6.7] Jerarquía de ventanas y vistas en un aplicación iOS [6.8] Ficheros de interfaz gráfica: Xibs [6.9] File’s Owner [6.10] Outlets [6.11] Nibs [6.12] Controladores de vista [6.13] El archivo Info.plist [6.14] El archivo .xcassets [6.15] Secuencia de inicio de una aplicación iOS TEMA

description

es un tema de no se que

Transcript of tema6

  • Introduccin al desarrollo de aplicaciones

    en iOS

    [6.1] Cmo estudiar este tema?

    [6.2] Targets y productos

    [6.3] Ficheros de cabecera (interfaces) y de implementacin

    [6.4] Principales caractersticas de Objective-C

    [6.5] Gestin de memoria en Objective-C

    [6.6] Delegado de aplicacin y controlador inicial

    [6.7] Jerarqua de ventanas y vistas en un

    aplicacin iOS

    [6.8] Ficheros de interfaz grfica: Xibs

    [6.9] Files Owner

    [6.10] Outlets

    [6.11] Nibs

    [6.12] Controladores de vista

    [6.13] El archivo Info.plist

    [6.14] El archivo .xcassets

    [6.15] Secuencia de inicio de una aplicacin iOS

    T

    EM

    A

  • Fundamentos y tecnologas

    TEMA 6 Esquema

    Esquema

    En

    este

    tem

    a va

    mos

    a in

    trod

    ucir

    nos e

    n la

    pro

    gram

    aci

    n en

    iPho

    ne/i

    OS.

    Al i

    gual

    que

    con

    el T

    ema

    4 va

    mos

    a p

    artir

    de

    un e

    jem

    plo

    muy

    senc

    illo

    para

    recu

    pera

    r la

    prim

    a de

    ries

    go y

    pin

    tarl

    a en

    un

    cuad

    ro d

    e te

    xto.

    Pod

    is h

    acer

    os u

    na id

    ea d

    e c

    mo

    vam

    os a

    evo

    luci

    onar

    est

    e pr

    oyec

    to e

    n la

    Fig

    ura

    1. L

    as

    etiq

    ueta

    s que

    apa

    rece

    n en

    est

    a fig

    ura

    se e

    xplic

    an m

    s a

    dela

    nte.

    Por o

    tro

    lado

    , es p

    osib

    le q

    ue n

    o te

    ngi

    s a v

    uest

    ra d

    ispo

    sici

    n u

    n M

    ac (

    nica

    pla

    tafo

    rma p

    osib

    le p

    ara d

    esar

    rolla

    r app

    sen

    iOS)

    . En

    ese

    caso

    os

    reco

    men

    dam

    os q

    ue le

    is e

    l tem

    a co

    n no

    rmal

    idad

    , ya

    que

    incl

    uso

    aunq

    ue n

    o po

    dis

    pra

    ctic

    ar, o

    s ayu

    dar

    en

    vues

    tra

    com

    pren

    sin

    glo

    bal s

    obre

    el

    des

    arro

    llo e

    n en

    torn

    os m

    vile

    s y la

    pro

    gram

    aci

    n or

    ient

    ada

    a ob

    jeto

    s.

    Intr

    od

    ucc

    in

    al d

    esar

    roll

    o d

    e ap

    lica

    cio

    nes

    en

    iOS

    Xib

    s, N

    ibs

    e in

    terf

    aces

    Con

    trol

    ador

    es

    El l

    engu

    aje

    Obj

    etiv

    e-C

    Lay

    outs

    El a

    rch

    ivo

    pli

    st Del

    egad

    o d

    e la

    ap

    lica

    cin

    Rec

    urs

    os

    Con

    text

    os

    Fil

    es

    Ow

    ner

    y O

    utl

    ets

    Figu

    ra 1.

    Una

    sen

    cilla

    app

    para

    iPho

    nepa

    ra

    aden

    trar

    nos e

    n el

    des

    arro

    llo e

    n es

    ta a

    rqui

    tect

    ura

    mv

    il

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Ideas clave

    6.1. Cmo estudiar este tema?

    Para estudiar este tema debers leer las Ideas clave que te presentamos a

    continuacin.

    Es conveniente haber ledo y trabajado el Tema 3. El Tema 3 sienta las bases de la

    programacin estructurada y orientada a objetos con la que seguiremos trabajando en

    este tema.

    Tambin es buena idea recordar la parte del Entorno de Desarrollo Integrado (IDE)

    Xcode que estudiamos en el Tema 2.

    Igualmente y como comprobaris, el tema est plagado de referencias a Android, ya que

    vamos a emplear mucho la tcnica pedaggica de transferencia de conocimientos. Por

    lo tanto, tambin os recomendamos que os aseguris de que no tenis dudas pendientes

    de los temas 4 y 5.

    El objetivo de este tema es que buceemos a escasa profundidad en las aguas de una

    aplicacin iOS. A esta profundidad aparecern las primeras especies (conceptos,

    prcticas habituales, retos) y debemos acostumbrarnos a su presencia y a comprender

    su razn de ser y funcionamiento dentro del ecosistema. Al concluir el tema y la clase

    online, deberamos sentirnos con relativa confianza ante el desarrollo de aplicaciones

    iOS sencillas.

    Vamos a comentar la teora sobre algunos aspectos que aparecern en el ejemplo.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    6.2. Targets y productos

    Una de las primeras cosas que os chocar nada ms crear un proyecto con Xcode ser la

    aparicin de los denominados targets. En Xcode, un proyecto puede desembocar en

    diferentes productos.

    Los productos son normalmente aplicaciones (para Mac, iPhone y/o iPad), pero

    tambin pueden ser frameworks o mdulos (como los que vimos en el Tema 3).

    Simplificando un poco el lenguaje podemos decir que un target es el conjunto de todas

    las acciones necesarias para generar un producto.

    No indagaremos ms en este aspecto pues, en la gran mayora de los casos solo

    tendremos un nico target que generar un nico producto y este producto ser una

    aplicacin. En el ejemplo y en la clase online nos limitaremos a reconocer el target, el

    producto y qu espacio les reserva Xcode.

    6.3. Ficheros de cabecera (interfaces) y de implementacin

    Si recordis, en Java tenamos propiedades pblicas y mtodos pblicos de objeto y clase.

    El resto de objetos saben automticamente que pueden acceder a estos. La forma de

    declararlos es como ya vimos en los Temas 3 y 4: dentro de la definicin de la propia clase.

    Sin embargo, en Objective-C, todo lo pblico (propiedades y mtodos) han de

    publicitarse en un fichero aparte que se llama cabecera. Los ficheros cabecera tienen

    extensin .h (de header).

    Este conjunto de propiedades y mtodos pblicos de una clase, en Objective-C se

    llaman interfaz. Se utiliza este nombre porque es la cara visible de la clase, por lo

    tanto, la interfaz se suele escribir en los ficheros de cabecera. En Java, la interfaz de las

    clases y los objetos se obtiene al especificar si estos son public. Si una propiedad o

    mtodo se clasifica como public, automticamente se considera parte de la interfaz y

    es accesible por el mundo exterior.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Los ficheros de implementacin por otro lado contienen la definicin completa

    (instruccin a instruccin) de todos los mtodos de clase e instancia. La Figura 2 nos

    muestra (utilizando algo pseudocdigo) esta separacin explcita que hace Objective-C

    entre implementacin e interfaz.

    Figura 2. Posible interfaz e implementacin obtenidas a partir de una clase Java.

    6.4. Principales caractersticas de Objective-C

    La esencia de las clases, los objetos, las propiedades y los mtodos en Objective-C es la

    misma que en Java. En realidad, todos los lenguajes orientados a objetos (que

    hablamos de manera general en el Tema 3) siguen una filosofa comn. La mayor de las

    diferencias entre uno y otro suele ser la sintaxis. Ya que hemos aprendido algo de Java,

    veamos las diferencias y semejanzas principales de Objective-C con este lenguaje:

    Objective-C tambin tiene datos primitivos (enteros, decimales, etc.) y objetos como

    Java. Los objetos, cuando se declaran, tienen un * delante del nombre. Ej:

    NSString *cadenaDeTexto;

    Los mtodos se invocan situando al objeto (o clase) y al mtodo entre corchetes [] en lugar de la notecin objeto.metodo() que vimos en Java. Ej: [objeto metodo];

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Los parmetros de los mtodos se escriben de manera infija (no entre parntesis

    separados por comas como en Java). Esta sintaxis suele llamar mucho la atencin a

    los recin llegados a este lenguaje. Ejemplo:

    [texto dameLaSubCadenaEntreLaPosicion:20 yLaPosicion:22];

    Cuando se quiere dar el nombre propio de un mtodo (para identificarlo, para

    buscar documentacin, etc.) se quitan todos los parmetros y se escribe todo junto.

    Por ejemplo:

    dameLaSubCadenaEntreLaPosicion:yLaPosicion:

    Las propiedades de los objetos se definen en la cabecera y tienen que ir precedidas

    de expresin @property(). Entre parntesis se especifica si son de solo lectura o

    de lectura y de escritura y cmo manejar su memoria (que veremos a continuacin).

    Para indicar que una clase es subclase de otra, se realiza en el fichero de cabecera y

    se utiliza el smbolo :. Ejemplo:

    @interface ClaseHija : ClaseMadre

    Swift

    El lenguaje por defecto para desarrollar apps es, a da de hoy, Objective-C y es con el

    que vamos a tratar en esta asignatura. Sin embargo, el Vicepresidente de Ingeniera del

    Software de Apple (Craig Federighi, al que podis ver en la imagen siguiente) present

    en la conferencia de desarrolladores de 2014 (WWDC2014) un nuevo lenguaje de

    programacin llamado Swift que actualmente se encuentra en fase de promocin y

    refinamiento. En la siguiente imagen podis ver cmo Xcode nos propone con qu

    lenguaje queremos trabajar (aunque insistimos: Objective-C es todava el lenguaje por

    defecto).

    Figura 3. Opciones de lenguaje que propone Xcode.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    6.5. Gestin de memoria en Objective-C

    Durante los Temas 4 y 5 de sobre Android y Java no nombramos en absoluto la

    expresin gestin de memoria. La memoria es un elemento bsico en cualquier

    sistema informtico y es limitada. La cantidad de memoria es crtica para que puedan

    cargarse y ejecutarse aplicaciones. Cuando estamos utilizando una app, todos sus

    objetos (actividades, modelos, controladores, contexto, cadenas de texto, etc.) ocupan

    memoria, y si esta no se controla, la aplicacin y el sistema pueden volverse inestables.

    La razn de que con Android no hayamos hablado de memoria es porque el lenguaje

    Java (y por tanto Android) cuentan con lo que se llama un recolector de basura.

    Este recolector es un mecanismo automtico por el cual, los objetos que ya no son

    usados, son borrados de la memoria y esta gana el espacio que antes estaban ocupando.

    En Objective-C la cosa es distinta. Objective-C no cuenta con este recolector en la

    plataforma iOS (s cuenta con uno en la plataforma Mac). En lugar de ello cuenta con

    otro mecanismo llamado cuenta de referencias. La cuenta de referencias consiste en

    que cada vez que un objeto es necesitado, se aumenta automticamente un nmero de

    manera consecutiva (empezando en 1). Por otro lado, cada vez que este nmero deja de

    necesitarse, este ndice decrece. Si el ndice llega a 0, al objeto se le pide que haga

    limpieza (como luego explicaremos) y se borra de la memoria.

    Esta gestin del ndice de referencias es semimanual. Por un lado, tenemos todo el

    control completo como programadores y por otro contamos con otros mecanismos ms

    automatizados que casi se parecen al recolector de basura de Java. Debido a su

    complejidad, no vamos a insistir demasiado en este tema, tan solo vamos a introducir

    los siguientes aspectos:

    Para aumentar la cuenta de referencias manualmente, utilizamos el mtodo retain

    sobre un objeto: [objeto retain]; al hacer esto solo nosotros y de manera

    manual, podemos volver a descontar el nmero de referencias.

    Para descontar referencias de manera manual, invocamos el mtodo release sobre

    el objeto en cuestin: [objeto release];

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Cuando se definen propiedades con la expresin property que hemos visto antes,

    entre parntesis podemos indicar si queremos que automticamente se llame al

    mtodo retain sobre el objeto al que apunta la propiedad. Ejemplo: @property

    (retain). Cuando se reescribe una propiedad, lo que ocurre es que se invoca

    primero el mtodo release sobre el objeto al que apuntaba (el antiguo) e

    inmediatamente se invoca retain sobre el nuevo objeto que pasa a ser el

    referenciado por la propiedad.

    Cuando la cuenta de referencias ha llegado a cero, se invoca automticamente el

    mtodo dealloc del objeto. Todas las clases tienen definido este mtodo para

    especificar cmo los objetos de esa clase deben hacer limpieza cuando van a ser

    barridos de la memoria. Es decir, todos los objetos en Objective-C saben planear

    su desaparicin como si de un testamento se tratara.

    La parte semiautomtica de la gestin de memoria en Objective-C la proporcionan los

    tanques de autoliberacin (autorelease pools). Estos tanques son como pequeos

    recolectores de basura que estn pendientes de la memoria ocupada por objetos en un

    determinado momento del tiempo o bloque de cdigo.

    Estos bloques suelen coincidir con el cuerpo de mtodos que se estn ejecutando.

    Cuando este bloque termina, se libera el tanque, lo que implica que a todos los objetos

    que estaban a l se les enva el mensaje release (con lo que desciende en una unidad

    su cuenta de referencias). Para incluir un objeto en un tanque de autoliberacin, le

    enviamos el mensaje autorelease.

    Ejemplo:

    [objeto autorelease];

    Todo esto parece un poco enrevesado, pero tenemos una buena noticia. En versiones

    recientes de Objective-C se ha dado un mecanismo nuevo llamado cuenta de referencias

    automtica (Automatic Reference Counting) o ARC. ARC simplifica mucho esta gestin

    de memoria semi-manual.

    En lo que nos concierne para este primer mdulo de introduccin (donde las apps son

    muy sencillas para que aterricis con seguridad en el mundo del desarrollo mvil) esto

    significa que no os tenis que preocupar por la gestin de memoria. Profundizaris en

    ARC en el mdulo correspondiente sobre desarrollo iOS.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Dicho de otra manera, para este primer mdulo de introduccin, ARC simplemente os

    permitir olvidaros de retains, releases y autoreleases, de manera que vuestro

    cdigo ser ms fcil.

    6.6. Delegado de aplicacin y controlador inicial

    Al igual que ocurra en Android, al iniciarse la aplicacin se crea automticamente un

    primer objeto que pone en juego la aplicacin. En el caso de Android, este objeto era

    una actividad que llambamos la actividad inicial. La eleccin de esta actividad inicial

    era fcil: solo era necesario indicarlo en el manifiesto.

    Como los ejemplos que hemos visto son sencillos no ha sido necesario hacerlo, pues

    contbamos con una nica actividad y el ADT modificaba el manifiesto por nosotros

    cuando utilizbamos el asistente de creacin de aplicacin.

    En iOS, el objeto que hace el papel de contexto es el delegado de la aplicacin y al

    contrario que con Android, s tenemos acceso al archivo de cdigo de la clase a partir de

    la cual se instancia el (nico) delegado y s podemos realizar cambios segn nuestro

    parecer. El nombre de la clase de este objeto delegado (s, solo hay uno) acaba en

    AppDelegate.m (.h para la cabecera). El delegado de la aplicacin se crea

    automticamente al iniciarse la aplicacin.

    Se utiliza el trmino delegado porque precisamente se delegan en l ciertas tareas.

    Dicho de otra forma, el delegado de la aplicacin debe implementar ciertos mtodos

    que definan el comportamiento de la aplicacin ante ciertos eventos o sucesos. El

    delegado sigue un protocolo, tal y como vimos en el Tema 3. De hecho, si miramos el

    fichero de cabecera de la clase del delegado, veremos que aparece la expresin

    que indica justamente que esta clase respeta este

    protocolo y por tanto est obligada a implementar ciertos mtodos.

    Una de las primeras cosas que debe hacer el delegado es crear un controlador principal.

    Este controlador es como la actividad inicial de Android. En Android, esta actividad se

    creaba automticamente por nosotros, es decir, se instanciaba un objeto a partir de la

    clase actividad principal. En iOS es parecido, solo que s podemos tener control sobre

    cmo se crea esta actividad, aunque lo normal es no realizar ninguna modificacin

    sobre los ficheros que Xcode nos regala.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Esta actividad inicial (controlador) la crea, como decamos, el delegado de la aplicacin.

    Dnde? Pues nada ms iniciarse la aplicacin, se enva un mensaje al objeto delegado

    de la aplicacin:

    - (BOOL) application:(UIApplication *)application

    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

    }

    En la definicin de este mtodo podemos escribir lo que queramos que realice nuestra

    aplicacin al inicio. En este mtodo, Xcode escribe inicialmente cdigo por nosotros

    que crea una ventana, una vista principal y el controlador. Como decamos, este cdigo

    es perfectamente modificable y es tan solo una ayuda que nos presta Xcode.

    Como con la actividad inicial de Android, el delegado de la aplicacin se ocupa de crear

    las primeras interfaces y realizar las primeras acciones en cuanto se abre la aplicacin.

    En el caso de la actividad, estas acciones iniciales tenan lugar en el mtodo onCreate.

    En el caso de iOS, esto ocurre entre el mtodo application:application

    didFinishLaunchingWithOptions: y el mtodo viewDidLoad del controlador

    que luego veremos.

    6.7. Jerarqua de ventanas y vistas en una aplicacin iOS

    Una de las primeras cosas que hace el mtodo que acabamos de mencionar es,

    efectivamente, pintar la interfaz. Para pintar la interfaz, iOS necesita un nico objeto

    ventana que es instancia de la clase UIWindow. Estas ventanas son ms o menos como

    las ventanas de las aplicaciones que utilizamos en nuestros ordenadores.

    Las ventanas y las vistas, adems, pueden encuadrarse dentro de lo que luego

    llamaremos un storyboard, el cual permite crear un flujo de transicin entre distintas

    pantallas. Para este primer mdulo de introduccin y por razones pedaggicas, solo

    trabajaremos con una nica ventana, luego es como si no estuviramos utilizando un

    storyboard.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Dentro de las ventas tenemos vistas. Estos objetos vista son muy parecidos a los que

    podemos encontrar en Android: se tratan de objetos que bsicamente definen un rea

    rectangular que puede pintar cosas (textos, dibujos, figuras 3D, etc.) y recibir inputs

    (toques, deslizamientos, gestos multi-toque, etc.). Podis ver una representacin de lo

    que acabamos de comentar en la Figura 4.

    Toda ventana tiene una vista principal o vista raz (rootView). Prcticamente puede

    decirse que casi nunca se accede o trabaja con la ventana directamente: se trabaja

    normalmente con esta vista principal (y con el controlador de la vista, como luego

    veremos).

    En iOS es muy comn que las vistas estn anidadas (que haya vistas dentro de vistas

    una dentro de otra). En Android tambin es posible, pero puede decirse que no es lo

    ms habitual.

    Figura 4. Jerarqua de vistas en una aplicacin iOS.

    6.8. Ficheros de interfaz grfica: Xibs

    Al igual que en Android, iOS cuenta con unos ficheros especiales para definir la interfaz

    de nuestras aplicaciones: los archivos .xib.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Cuando abrimos un fichero .xib, nos encontramos con un editor grfico de interfaz

    parecido al del ADT. La principal diferencia que nos gustara resaltar es que, este editor

    es, si cabe, ms fcil de utilizar que su gemelo en Android. La razn de esta sencillez es

    la siguiente: en iOS tenemos un nmero limitado de dispositivos y tamaos de pantalla

    y por tanto solo es necesario preocuparnos por el aspecto de nuestras aplicaciones en

    este nmero contado de configuraciones.

    En estos casos lo ms fcil es, a la hora de situar elementos (botones, imgenes, iconos,

    etc.) sobre el lienzo, emplear posiciones absolutas. Es decir, en todo momento

    referimos la posicin de un objeto al borde superior izquierdo de la pantalla (o de la

    vista inmediatamente superior). En el caso de Android, esto correspondera con un

    AbsoluteLayout (posicionamiento absoluto), que ya vimos que su uso estaba

    desaconsejado.

    A pesar de lo que acabamos de decir, Apple est realizando una apuesta bastante fuerte

    por nuevas resoluciones y tamaos de pantalla, con lo que poco a poco comienza a

    percibirse cierta segmentacin. Para lidiar con esto, ltimamente se ha aadido un

    elemento nuevo llamado constraints (ligaduras).

    Nosotros por simplicidad y razones didcticas solo nos limitaremos a decir que las

    ligaduras ayudan a crear posicionamiento relativo, y por tanto, es como si estuviramos

    trabajando con el RelativeLayout de Android, pero no las utilizaremos. Para desactivar

    las ligaduras hemos de deseleccionar Use Autolayout del panel derecho en Xcode

    cuando hayamos seleccionado previamente el fichero .xib.

    Actualmente se utlizan los xib para crear la pantalla de arranque de las apps.

    Anteriormente esto se haca exclusivamente con imgenes estticas que rellenaban la

    pantalla y presentaban la aplicacin al usuario.

    Los storyboards

    Los storyboards son ficheros que no solo definen una interfaz de usuario sino un flujo

    de navegacin entre distintas pantallas. Resultan muy tiles para automatizar la

    presentacin de elementos visuales. Permiten tambin componer flujos complejos

    como disyuntivas o retornos a una pantalla especfica si ciertas condiciones se cumplen.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Figura 5. Ejemplo de storyboard.

    6.9. Files Owner

    Otro elemento importante de los ficheros de interfaz es el Files Owner. El Files

    owner representa al objeto que ha cargado la vista. En el caso de los ejemplos que

    vimos con Android, quien cargaba el interfaz (el fichero XML de layout) era la actividad

    inicial (mtodo onCreate y a continuacin llamada a setContentView). En el caso

    de iOS, quien carga el interfaz (fichero xib de interfaz) es el controlador que hemos

    instanciado al principio en el delegado de la aplicacin.

    El Files Owner permite una comunicacin entre el cdigo escrito Objective-C (objetos

    creados en cdigo por nosotros) y los objetos que posicionamos grficamente en el

    editor del xib. Para el Files Owner, los elementos grficos pueden ser outlets, que

    vamos a ver a continuacin.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    6.10. Outlets

    Los outlets de un objeto del interfaz grfico son referencias de ese objeto a otros

    objetos del interfaz. Dicho de otra forma son como propiedades pblicas del objeto

    (como las que ya hemos visto en Java o las property que hemos introducido antes).

    Estas propiedades son a su vez otros objetos grficos (botones, vistas, listas, etc.).

    Sirven para que este objeto grfico pueda comunicarse con otros como es costumbre en

    la programacin orientada a objetos: mediante lectura y/o escritura de propiedades y

    llamada de mtodos.

    Lo ms comn es que estas referencias se creen entre el Files Owner y el resto de

    elementos grficos (en nuestro caso ser el cuadro de texto que pinta el nmero con la

    prima de riesgo). Por qu? Pues porque como hemos dicho, el Files Owner representa

    al objeto que carga la interfaz. Y quin es este objeto? Pues normalmente es el

    controlador de la vista, y de este objeto s tenemos acceso a su cdigo. Puede decirse

    que junto con el Files Owner, los outlets permiten una comunicacin fluida entre el

    cdigo y los objetos grficos, como podis ver en la Figura 6.

    Figura 6. Comunicacin entre elementos en cdigo Objective-C y objetos grficos

    En Android, para comunicarnos con un elemento grfico, utilizbamos el mtodo

    findViewByID que nos devolva dicho elemento usando para ello un identificador

    unvoco del mismo.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    6.11. nibs

    Cuando se compila la aplicacin para ser ejecutada, los ficheros xib se traducen a otro

    formato ms compacto llamado nib (que ya no es XML, sino binario). Es muy comn

    encontrar mtodos, nombres de clases y palabras dentro de la documentacin que

    contienen las letras nib. Nosotros hablaremos de xibs y de nibs indistintamente.

    6.12. Controladores de vista

    Nuevamente, como en Android, vamos a trabajar con el modelo MVC. En el tema 4, el

    controlador era la actividad inicial (recuperaba el valor de la prima desde internet y le

    ordenaba a una vista de clase TextView que la pintara). En el caso de iOS y por lo que

    hemos visto hasta ahora, podemos pensar que el controlador es el delegado de la

    aplicacin, pero no. El delegado de la aplicacin es, como ya hemos visto, un fichero que

    viene pre-redactado para nosotros y que apenas es necesario modificar. Lo que ocurre es

    que, normalmente, en el mtodo application:didFinishLaunchingWithOptions:

    se crea un primer controlador que gestiona e interacciona con la vista raz de la ventana de

    la aplicacin. Si la aplicacin es sencilla (como es nuestro caso), basta con este controlador

    y con esta vista raz para hacer todas las operaciones necesarias.

    Los controladores en iOS tienen un mtodo parecido a onCreate con el que contbamos

    en Android para las actividades. En el caso de iOS, este mtodo se llama viewDidLoad.

    Este mtodo se implementa en el fichero de implementacin (.m) del controlador y, al

    igual que con Android, dentro de este mtodo tenemos que escribir lo que queremos la

    aplicacin haga cuando se carga este controlador y se haya pintado la interfaz.

    (void)viewDidLoad {

    [super viewDidLoad];

    // Otras instrucciones

    }

    La principal diferencia con Android es que el controlador lee el fichero de definicin de

    la vista (xib) automticamente (no es necesario decrselo mediante cdigo). En Android

    tenamos que hacerlo manualmente (mtodo setContentView). Por otro lado, al

    igual que con Android, lo primero que hacemos es llamar al mismo mtodo de la clase

    madre ([super viewDidLoad]).

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    6.13. El archivo Info.plist

    Este archivo es muy parecido al archivo del manifiesto que vimos en Android y de

    hecho, internamente, tambin tiene estructura XML. El archivo Info.plist tambin

    registra informacin relevante como el nombre de la aplicacin, los iconos, tipos de

    archivo que puede hablar, versin, idioma por defecto, orientaciones del dispositivo

    soportadas por la app, etc.

    Otro parecido importante es que Xcode tiene uno o varios editores intuitivos de este

    archivo para no tener que lidiar con las dificultades. Para acceder a este editor tenemos

    que seleccionar el icono del proyecto en la seccin de la izquierda y luego el target que

    corresponde con nuestra aplicacin (Figura 7).

    Quizs un parmetro que puede llamar la atencin sean las imgenes de inicio (launch

    images). Todas las aplicaciones iOS muestran una imagen fija en el momento de

    abrirse. Es como una especie de splash screen que vemos habitualmente en los

    programas de ordenador. Tenemos que asignar una segn el tamao de pantalla de

    cada dispositivo y segn se trate de una pantalla de alta resolucin (retina segn

    nomenclatura Android) o no. Hablaremos de cmo iOS gestiona estos recursos grficos

    en el tema siguiente.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    Figura 7. Acceso al editor del archivo Info.plist.

    6.14. El archivo .xcassets

    Nuestras aplicaciones no solo contienen cdigo ejecutable y ficheros de definicin de

    interfaz (xibs y storyboards en el caso de iOS), sino que tambin estn compuestas de

    multitud de imgenes e iconos. Hasta hace poco, todos estos se almacenaban en

    nuestra app sin ninguna organizacin especial. Pues bien, con versiones recientes de

    Xcode, Apple decidi dotar de un poco de jerarqua a este desorden mediante el fichero

    xcassets. Este fichero no es ms que una carpeta virtual donde podemos almacenar y

    categorizar todas las imgenes de nuestro proyecto: imgenes de arranca, iconos, etc.

  • Fundamentos y tecnologas

    TEMA 6 Ideas clave

    6.15. Secuencia de inicio de una aplicacin iOS

    En estos ltimos puntos han aparecido muchos nuevos trminos: delegados,

    controladores, etc. Vamos a repasar cmo nace y se desarrolla una app iOS (Figura 8):

    1. Se inicia la aplicacin.

    2. Se crea un objeto delegado (fichero AppDelegate.m y .h)

    3. En el mtodo application:didFinishLaunchingWithOptions: ocurre que:

    Se crea una ventana (UIWindow) que automticamente tiene una vista raz.

    Se crea un objeto controlador de la vista raz.

    Se asigna este controlador a la vista.

    4. El controlador carga el fichero de interfaz (fichero xib) .

    5. Se realizan las primeras acciones (como poner o pintar cosas en la vista raz, buscar

    la prima de riesgo, etc.) en el mtodo viewDidLoad del controlador.

    Figura 8. Esquema de inicio de una app en iOS.

  • Fundamentos y tecnologas

    TEMA 6 Ejemplos

    Ejemplos

    Como ya hemos dicho, vamos a crear una sencilla app muy parecida a la del Tema 4.

    Primeros pasos

    Empezamos abriendo Xcode y eligiendo New -> Project y a continuacin veremos

    un asistente parecido al que ya vimos con el ADT de Android. Igualmente, este

    asistente no es ms que una especie de editor preliminar, grfico e intuitivo al fichero

    Info.plist, que define ciertas caractersticas de la aplicacin. En la Figura 9 podis ver

    que la informacin que se solicita es muy parecida, incluso es necesario usar la notacin

    com.empresa.departamento.nombreapp para identificar la aplicacin.

    Quizs lo nico que difiere es que este asistente de Xcode nos ofrece unas cuantas

    plantillas para empezar a desarrollar aplicaciones tpicas. Nosotros, por simplicidad y

    por razones pedaggicas, vamos a elegir la plantilla de Aplicacin de nica Vista. Al

    elegir esta plantilla, Xcode crear automticamente por nosotros una clase delegado y

    un controlador para la vista. En la clase delegado, tambin incluir el cdigo necesario

    para que se instancie este controlador. Si hubiramos elegido otra plantilla, Xcode

    seguramente hubiera creado otros ficheros y clases. Hemos elegido esta porque

    produce una estructura y base muy parecida a la que ya vimos con Android.

    Desmarcaremos las opciones de usar Storyboards, Automatic Reference Counting y

    Include Unit Tests, cuya complejidad se sale de los objetivos del mdulo.

    Tambin elegiremos crear una app solo para iPhone. Es posible elegir desde aqu una

    aplicacin para iPad o incluso una aplicacin universal (que funciona en ambos

    dispositivos) pero por razones de tiempo no la veremos.

    El campo Class Prefix es opcional y sirve para prefijar unas letras a cada fichero de

    clase e interfaz. Nosotros hemos elegido MAM (de Mster de Aplicaciones Mviles).

  • Fundamentos y tecnologas

    TEMA 6 Ejemplos

    Figura 9. Primeros pasos de la creacin de un proyecto de aplicacin iOS.

    Proyecto en Xcode

    Una vez que han concluido estos pasos preliminares se nos presenta la ventana del

    proyecto. En esta ventana vamos a editar bsicamente a editar 2 ficheros: el

    controlador de la vista y la vista en s (fichero xib).

    Como se ha comentado previamente, Xcode cuenta desde versiones recientes de los

    storyboards. Si bien estos storyboards eran al principio opcionales, desde un tiempo a

    esta parte son la opcin por defecto para crear interfaces grficas. No hay por qu tener

    miedo a los storyboards: no son otra cosa sino uno o varios xibs encadenados en un

    flujo de eventos que cuenta la historia de nuestra aplicacin.

    Para empezar en este curso, haremos uso inicialmente de un xib, pero tendremos que

    aadirlo manualmente. Aadiremos un xib correspondiente a una ventana que ser

    donde discurrir la accin de nuestro humilde pero majestuoso primer programa. En la

    siguiente figura se muestro como aadir un xib a nuestro proyecto y cmo indicar a

    Xcode que esta es la interfaz principal. Esto ltimo se hace indicndolo en el fichero

    Info.plist (que tambin viene reseado en la imagen). Si tenis dudas, estas quedarn

    resueltas en clase, cuando el profesor realice estas acciones en vivo para vosotros.

  • Fundamentos y tecnologas

    TEMA 6 Ejemplos

    Como ya hemos indicado, tambin tenemos el delegado de la aplicacin, que, por ahora

    no modificaremos, pero recordamos que el delegado, en el mtodo

    application:didFinishLaunchingWithOptions: (que se invoca cuando se

    arranca la aplicacin) crea este primer controlador y la vista que tiene que administrar.

  • Fundamentos y tecnologas

    TEMA 6 Ejemplos

    Veamos primero el fichero del controlador en la Figura 10:

    Figura 10. Cabecera e implementacin del controlador de la vista raz.

    Como ya dijimos, el mtodo viewDidLoad se ejecuta al cargarse la vista de la que es

    responsable el controlador. Se parece por tanto mucho al mtodo onCreate en las

    actividades de Android. En este mtodo buscamos la prima desde internet como ya

    hicimos en el Tema 4. No vamos a entrar en los detalles de cmo se realiza esta

    conexin y qu clases y objetos entran en juego, ya que, por su complejidad escapan de

    nuevo a los objetivos del tema y del mdulo. Lo importante es que al final tenemos un

    objeto de clase NSString (muy comparable a los String de Java) y que lo asignamos

    a la propiedad text del campo de texto primaLabel (que es un campo de texto

    grfico de clase UILabel). Este campo de texto es, a su vez, un outlet del controlador

    que establece una conexin con el cuadro de texto. Esta conexin se produce

    grficamente, como luego veremos.

    La notacin self.propiedad indica que es una propiedad del propio objeto. La

    expresin self hace referencia al objeto mismo, es decir, el que est ejecutando estas

    instrucciones en ese preciso momento. En Java se utiliza this, pero normalmente se

    omite.

  • Fundamentos y tecnologas

    TEMA 6 Ejemplos

    La notacin cadena_de_texto = @hola sirve para crear objetos de tipo

    NSString de manera rpida. En programacin, cuando se da un sintaxis especial para

    atajar la creacin de un objeto se llama literal. Los objetos de tipo NSString

    representan cadenas de texto constantes.

    Memoria y limpieza

    La gestin de memoria de nuestra aplicacin bastante sencilla. Sin embargo ser en la

    clase on-line cuando hagamos un seguimiento ms concreto de cmo va aumentando y

    disminuyendo la memoria, los objetos que la componen y la cuenta de referencias de

    cada uno.

    De momento diremos que tanto el objeto delegado como el controlador viven hasta que

    la aplicacin termina. Como es el delegado quien ha creado el (nico) controlador, este

    es el responsable de deshacer (mediante un release) cualquier retain que hubiera

    podido darse (solo uno). Esto debe ocurrir en el mtodo dealloc del delegado.

    Igualmente, el controlador debe hacer limpieza cuando le toque desaparecer. En su

    mtodo dealloc deshace el nico retain que tena primaLabel. En el controlador

    tambin se crean otros tantos objetos (request, page_content, etc.) que sera

    necesario incluir en el mtodo dealloc. Por qu no lo hacemos? Porque se

    encuentran en un tanque de autoliberacin y el sistema ya les enviar el mensaje

    release cuando corresponda.

    Como se ha comentado antes, gracias a la gestin de memoria con ARC (que con

    versiones recientes de Xcode se ha convertido en la opcin por defecto para gestionar la

    memoria) no necesitamos preocuparnos, al menos en estos inicios del curso, de

    retains, deallocs, etc.

  • Fundamentos y tecnologas

    TEMA 6 Ejemplos

    La interfaz grfica

    Al igual que en Android, podemos tener muchos ficheros que definan distintas

    interfaces o trozos de estas. Como nuestras apps son muy sencillas, solo contamos con

    un fichero de este tipo tanto en una como en otra arquitectura.

    Como ya hemos comentado, al crear el proyecto de la aplicacin se crea para notros un

    fichero de interfaz vaco y que el controlador cargar automticamente. Al abrir este

    fichero, al igual que con Android, tenemos acceso al editor grfico. Este editor es si cabe

    mucho ms sencillo de utilizar y, a diferencia de Android, jams es necesario cambiar a

    la vista XML para hacer retoques o modificaciones (de hecho no existe esta opcin).

    La interfaz grfica es sencilla y la podis ver en la Figura 11: solo situamos un cuadro de

    texto de la clase UILabel desde el panel de la derecha y una vista de imagen (de clase

    UIImageView) para poder dibujar el mismo fondo que ya utilizamos en el Tema 4.

    En la clase online veremos cmo crear el outlet desde el Files Owner (el controlador) al

    cuadro de texto. Este outlet es necesario para que el controlador pueda hablar con el

    cuadro de texto y decirte qu valor de la prima ha de escribir. Al establecer este outlet

    es cuando se produce el (nico) retain sobre primaLabel.

    Tambin veremos cmo cambiar el fondo de pantalla mediante un UIImageView. Son

    operaciones muy sencillas pero que describen mejor al verse.

    Figura 11. Fichero Xib con una vista y dos vistas internas: un UIImageView un UILabel (con prima).

  • Fundamentos y tecnologas

    TEMA 6 Ejemplos

    Resumen

    Hemos creado una aplicacin sencilla para iPhone con Xcode. Por simplicidad hemos

    elegido una app de una nica vista. Xcode crea un delegado de aplicacin, un fichero de

    interfaz y un controlador de la vista raz. El flujo de ejecucin es muy parecido a

    Android. En aplicaciones sencillas, normalmente todas las acciones tienen lugar en el

    mtodo viewDidLoad del controlador que corresponde con el mtodo onCreate de

    las actividades.

    Cuando pulsemos el botn de ejecucin (icono de play) Xcode compondr nuestra

    aplicacin y la ejecutar en el emulador automticamente. En la seccin de Build

    Phases que podis ver en la figura siguiente, Xcode nos presenta todas las acciones que

    va a completar para fabricar nuestra app: compilar los ficheros de cdigo, incluir los

    mdulos y frameworks necesarios y por ltimo copiar los recursos (iconos, grficos,

    etc.), incluido el fichero Info.plist.

    Figura 12. Pasos que realiza Xcode para crear y lanzar la aplicacin.

  • Fundamentos y tecnologas

    TEMA 6 Lo + recomendado

    Lo + recomendado

    No dejes de leer

    Curso prctico para programadores Mac OS-X, iPhone y iPad

    Lpez Hernndez, F. (2012). Objetive-C: curso prctico para programadores Mac OS-

    X, iPhone y iPad. Madrid: RC Libros.

    Si tenis curiosidad en conocer ms acerca de los fundamentos

    de aplicaciones iOS y Mac OS X (entornos y filosofas de

    desarrollo muy parecidos), no dudis en leer el primer captulo

    del libro Objective-C: Curso prctico para programadores Mac

    OS X, iPhone y iPad, que ya va por su segunda edicin.

    El captulo est disponible en el aula virtual.

  • Fundamentos y tecnologas

    TEMA 6 + Informacin

    + Informacin

    A fondo

    Programacin Mac OS X

    Hillegass, Aaron. (2010). Programacin Mac OS X. Madrid: Anaya Multimedia.

    Clsico entre los que quieren introducirse en el mundo de la

    programacin en Mac OS X, muy ligada a la programacin en

    iOS.

  • Fundamentos y tecnologas

    TEMA 6 Actividades

    Actividades

    Tu primera aplicacin para iPhone

    Esta actividad debers hacerla por tu cuenta, no tendrs que entregarla. Si te surgen

    dudas, puedes plantearlas en el foro.

    Si tienes acceso a un Mac, al igual que en el tema anterior, te proponemos que intentes

    reproducir en casa el ejemplo que acabamos de ver. Como ya hemos insistido, no tengas

    miedo de romper nada y mucho menos de no llegar a tener una app corriendo en el

    emulador. Lo importante es lanzarse es practicar. Incluye en un documento las

    capturas de pantalla y comentarios sobre cada paso.

    Si no tienes acceso a un Mac redacta un documento en el que describas las diferencias y

    similitudes que ves con respecto a la plataforma Android. Emplea tus propias palabras,

    plantea dudas, compara estilos, etc. Adjunta capturas de pantalla, aunque sean de

    desde propio tema o tomadas de pginas de internet para el caso de Xcode (intenta que

    las de Android sean cosecha tuya). Tampoco tengas miedo equivocarte y a decir

    incongruencias: lo importante es reflexionar y ejercitar la transferencia de

    conocimientos entre una plataforma y otra.

  • Fundamentos y tecnologas

    TEMA 6 Test

    Test

    1. Un target en Xcode:

    A. Es siempre un programa de Mac.

    B. Pueden ser programas, frameworks e incluso pequeos scripts.

    C. Es lo mismo que un proyecto.

    D. Son espacios de trabajo.

    2. Una cabecera en Objective-C:

    A. Contiene propiedades y mtodos pblicos y propiedades privadas.

    B. Es lo mismo que una cabecera en Android.

    C. Es un fichero de configuracin.

    D. Contiene la implementacin de mtodos y propiedades pblicos.

    3. Un xib es:

    A. Un archivo de cabecera.

    B. Un archivo html que contiene una interfaz.

    C. Un archivo XML que contiene una interfaz.

    D. Lo mismo que el fichero manifiesto en Android.

    4. Un nib es:

    A. Idntico a un xib.

    B. Un xib compactado para usarse durante la ejecucin de la aplicacin.

    C. Un controlador de interfaz.

    D. El fichero de configuracin de la aplicacin.

    5. El mtodo viewDidLoad:

    A. Devuelve un objeto vista que se puede utilizar.

    B. Se define en el delegado de la aplicacin.

    C. Permite ejecutar rdenes inmediatamente despus de cargarse la interfaz.

    D. Permite ejecutar rdenes inmediatamente antes de cargarse la interfaz.

  • Fundamentos y tecnologas

    TEMA 6 Test

    6. Self:

    A. Hace referencia al propio objeto.

    B. Hace referencia a la clase del objeto.

    C. Es lo mismo que this en Java.

    D. Las respuestas A y C son correctas.

    7. Un outlet:

    A. Es un tipo bsico.

    B. Es una referencia a otro objeto no accesible desde el xib.

    C. Es una referencia a un objeto grfico.

    D. Es lo mismo que el Files Owner.

    8. El Files Owner:

    A. Es siempre un controlador.

    B. Puede ser (y normalmente es) un controlador.

    C. Corresponde con el delegado de la aplicacin.

    D. No sirve para nada y se mantiene por legado.

    9. Los objetos de tipo NSString:

    A. Son tipos bsicos.

    B. Son objetos cadena de texto de longitud variable.

    C. Son objetos cadena de texto de longitud constante.

    D. Son cuadros de texto grficos.

    10. El mtodo dealloc:

    A. En l se ejecutan todos los posibles release sobre cualquier objeto sobre el

    que hayamos hecho retain.

    B. Borramos todos los objetos del programa.

    C. Se ejecuta al inicio de la aplicacin.

    D. Es lo mismo que release.