tema6
-
Upload
daniel-munoz-melendez -
Category
Documents
-
view
2 -
download
1
description
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.