Professional Documents
Culture Documents
ndice de contenido
Introduccin a Xcode e IOS4.................................................................................................9
Introduccin.......................................................................................................................9
El sistema operativo IOS 4..............................................................................................10
Capas del IOS:............................................................................................................12
Capa: Core OS........................................................................................................12
Capa: Core Services...............................................................................................13
Frameworks del Core Services...........................................................................15
Capa: Media Layer..................................................................................................18
Frameworks de Media Layer..............................................................................21
Capa: Cocoa Touch Layer...........................................................................................23
Frameworks de Cocoa Touch.................................................................................26
XCODE............................................................................................................................30
Edicin y visualizacin de tipos de datos................................................................32
Escribir, editar y comprobar cdigo fuente..............................................................32
Editar la configuracin.............................................................................................33
Edicin de valores y claves.....................................................................................33
Diseo grfico del modelo de objetos.....................................................................33
Definir reglas de trasformacin en la migracin delos datos del modelo...............33
Diseo grfico del interfaz de usuario.....................................................................34
Visualizar archivos en paneles separados..............................................................35
Bsqueda de informacin para editar o visualizar..................................................35
Visualizacin de los archivos del proyecto o del rea de trabajo Workspace.....35
Navegacin a travs de los smbolos en un proyecto............................................35
Bsqueda de texto..................................................................................................36
Visualizacin de alertas..........................................................................................36
Manejo de puntos de control...................................................................................36
Control de los hilos y la pila de ejecucin...............................................................36
Grabacin de logs de usuario.................................................................................37
Informacin complementaria en el editor................................................................37
Obtener plantillas, archivos y objetos del Interface Builder....................................38
La Ventana del Organizador...................................................................................39
Visualizar y marcar documentos del proyecto........................................................39
Creacin de un nuevo proyecto..............................................................................40
Ms caractersticas de Xcode.................................................................................42
Espacios de trabajo (Workspaces).........................................................................42
Actualizacin de proyectos.....................................................................................43
Objective-C y Patrn MVC...................................................................................................44
El lenguaje Objective-C...................................................................................................44
Introduccin.................................................................................................................44
Clases..........................................................................................................................46
La interfaz................................................................................................................46
La implementacin..................................................................................................47
Objetos........................................................................................................................48
Instanciar Objetos...................................................................................................48
Tipos estticos y dinmicos....................................................................................48
Variables de instancia.............................................................................................49
Los mtodos................................................................................................................49
Declaracin de un mtodo......................................................................................50
Implementacin de un mtodo................................................................................50
5
Ejecucin de un mtodo..........................................................................................51
Encapsulacin.........................................................................................................51
Estructuras de datos usando clases...........................................................................51
Cadenas de caracteres...............................................................................................52
Crear cadenas.........................................................................................................52
Imprimir cadenas formateadas................................................................................52
Tipos de Datos.............................................................................................................53
Herencia......................................................................................................................53
Los receptores especiales Self y Super......................................................................54
Objetos de Clases.......................................................................................................55
Categoras...................................................................................................................56
Protocolos....................................................................................................................56
Extensiones.................................................................................................................57
Modelo-Vista-Controlador................................................................................................58
Creacin de Interfaces Grficas..........................................................................................62
Arquitectura de ventanas y vistas....................................................................................63
Jerarquas de vistas y manejo de subvistas....................................................................64
El ciclo de vida de un grfico...........................................................................................65
Modos de contenidos.......................................................................................................65
Vistas extensibles............................................................................................................66
Soporte integrado de animaciones..................................................................................67
Vistas geomtricas y sistemas de coordenadas.............................................................68
Propiedades Frame, Bounds y Center de las vistas.......................................................68
Transformaciones del sistema de coordenadas..............................................................70
Puntos vs Pixel................................................................................................................70
Modelo de interaccin en tiempo de ejecucin con las vistas........................................71
Uso Efectivo de las vistas................................................................................................72
Interface Builder...................................................................................................................74
Los archivos .nib..............................................................................................................74
Crear la interfaz de usuario.............................................................................................75
El rea de utilidades....................................................................................................77
Aadir objetos a una vista...........................................................................................79
Configurar los contenidos de objetos..........................................................................80
Poner nombre a una accin e inicializarla..................................................................81
Aadir un Outlet........................................................................................................83
Probar la aplicacin.....................................................................................................84
Jerarqua de objetos en Interface Builder..................................................................84
Gestin de la pantalla..........................................................................................................85
Ventanas..........................................................................................................................85
Crear y configurar una ventana...................................................................................85
Cambiar el nivel de ventana........................................................................................86
Vistas...............................................................................................................................87
Creando y manejando una jerarqua de vistas...........................................................90
Aadir y borrar subvistas........................................................................................90
Ajustar el tamao y la posicin de una vista en tiempo de ejecucin....................93
Modificacin de vistas en tiempo de ejecucin.......................................................95
Interaccin con las capas Core Animation..............................................................96
Definir una vista personalizada...............................................................................98
Animaciones..................................................................................................................101
Animacin de Cambios en las propiedades de una vista.........................................102
6
Eventos..............................................................................................................................106
Acerca de los eventos en iOS.......................................................................................106
Reconocedores de gestos.............................................................................................107
Creacin de un reconocedor de gestos personalizado.............................................112
Entrega de eventos: La cadena de respuesta...........................................................113
Eventos de movimiento.............................................................................................114
Eventos de control remoto.........................................................................................116
Persistencia de datos.........................................................................................................118
Introduccin....................................................................................................................118
Core Data Stack........................................................................................................119
Gestin de un modelo de datos................................................................................123
Aadiendo Eventos........................................................................................................126
Preferencias de usuario.....................................................................................................132
Acerca de las preferencias y ajustes.............................................................................132
Sobre el sistema de usuario por defecto.......................................................................132
Qu hace bueno una preferencia?.....................................................................132
Proporcionar una interfaz de Preferencia.............................................................133
La Organizacin de las Preferencias....................................................................133
Visualizar las preferencias utilizando la herramienta por defecto........................135
Acceso a los valores de las preferencias......................................................................136
Registro de Preferencias de su aplicacin por defecto.............................................136
Sincronizando y detectando cambios en las preferencias........................................137
Estados de las App y multitarea.........................................................................................138
Gestin de cambios de estado de una aplicacin.........................................................138
Acerca de la funcin main...........................................................................................142
Qu hacer en tiempo de lanzamiento de una app?....................................................143
Repuesta a interrupciones.............................................................................................144
Moviendo App al background........................................................................................147
Volviendo al primer plano..............................................................................................148
Finalizacin de una App.................................................................................................149
El bucle de ejecucin principal......................................................................................150
Ejecucin en background y multitarea...........................................................................151
Determinar si Multitarea est disponible.......................................................................151
Ejecucin de una tarea finita en el background............................................................152
Encolando la distribucin de notificaciones locales......................................................152
Implementando tareas de ejecucin prolongada en el background.............................153
Mapas y localizacin..........................................................................................................155
Obtencin de la ubicacin del usuario...........................................................................155
Obtener la ubicacin actual del usuario........................................................................156
Puesta en marcha del Servicio Estndar Localidad......................................................156
Inicio del servicio de ubicacin significativo..................................................................157
Convertir coordenadas en informacin de un lugar......................................................159
Obtencin de informacin mediante Placemark CLGeocoder......................................159
Conversin de nombres de lugares en coordenadas...................................................160
Dibujando Mapas...........................................................................................................161
Agregar una vista del mapa a la interfaz de usuario.....................................................161
Acceso a la librera de imgenes.......................................................................................165
Uso del Framework Image I / O en una aplicacin.......................................................165
Formatos de imagen admitidos.....................................................................................166
Creando y usando fuentes de imgenes.......................................................................167
7
Fuente: http://developer.apple.com
IOS es el Sistema Operativo que se ejecuta en los dispositivos Iphone, Itouch e Ipad. El
Sistema operativo controla el hardware de los dispositivos y proporciona la tecnologa
necesaria para implementar aplicaciones nativas. El Sistema Operativo tambin maneja
las aplicaciones del sistema como el telfono, correo el navegador (safari) y proporciona
servicios estndar del sistema al usuario.
El SDK Software Development Kit junto con el programa Xcode, es el entorno que permite
realizar desarrollo de programas en estos dispositivos, contienen las herramientas e
interfaces que se necesitan para desarrollar, instalar, ejecutar y realizar los test de
aplicaciones que aparecen en el escritorio de un sistema IOS.
Los programas nativos utilizan los frameworks del sistema y el lenguaje Objective-C y se
ejecutan directamente sobre IOS. De forma distinta que las aplicaciones web, las
aplicaciones nativas se instalan fsicamente en un dispositivo y estn siempre disponibles
para el usuario, incluso si el dispositivo est en modo "vuelo". Las aplicaciones son
residentes al igual que las del sistema y cualquier aplicacin as como datos pueden ser
sincronizadas con el ordenador del usuario va Itunes.
Es posible crear tambin aplicaciones web usando una combinacin de html, CSS y
cdigo JavaScript, esta se ejecutarn dentro del navegador Safari y requerirn una
conexin a Internet. Las aplicaciones nativas por otra parte como son instaladas
directamente en el dispositivo pueden ejecutarse sin conexin a Internet.
Las capas de IOS son las que se pueden apreciar en la figura anterior
Las capas superiores estn ms cercanas al usuario y reciben las entradas que realiza
este en el programa, gestionan dichas entradas y las traducen a acciones que se derivan
en actuaciones del hardware que est ms cerca de los niveles inferiores.
Para los programadores de IOS es preferible escribir cdigo que use las capas de mayor
nivel siempre que sea posible, simplemente se ahorrar tiempo en el desarrollo de las
aplicaciones, ya que dichas capas proveen un nivel de abstraccin orientado a objetos y
superior. Escribir cdigo para las capas de alto nivel libera al programador de controlar
sockets e hilos de ejecucin. Aunque las capas de bajo nivel son accesibles, solamente se
deberan utilizar para programar determinadas funciones que o bien no estn
implementadas o la implementacin que tienen no es suficiente para el software que se
est desarrollando.
10
Figura 1.2
Fuente: http://www.calvinx.com
E / S estndar
Asignacin de memoria
Clculos matemticos
Contiene los servicios fundamentales del sistema que utilizan las aplicaciones. Muchas de
las partes del IOS usan esos servicios directamente. Las tecnologas disponibles
en esta capa son:
Almacenamiento iCloud es un servicio ofrecido a partir de IOS 5 que permite al sistema
acceder a los ficheros que el usuario haya almacenado en la nube de Apple. Hay dos
formas de que las aplicaciones usen el almacenamiento de iCloud, cada uno de los cuales
tiene un uso diferente:
Para facilitar la realizacin de una tarea en todos los elementos de una coleccin
Data Protection: Introducido en iOS 4.0, permite a las aplicaciones que trabajan con datos
de usuario confidenciales usar la encriptacin disponible en algunos dispositivos. Cuando
se designa a un archivo especfico como protegido, el sistema almacena ese archivo en
disco en un formato codificado. Mientras el dispositivo est bloqueado, el contenido del
archivo es inaccesible tanto para la aplicacin como para cualquier intruso potencial. En
iOS 5 y versiones posteriores, la proteccin de datos incluye niveles adicionales de
seguridad. Estos niveles permiten acceder a un archivo abierto, incluso si el usuario
bloquea el dispositivo y acceder a un archivo despus del arranque del dispositivo y
desbloqueo primero, incluso si el usuario posteriormente bloquea el dispositivo.
File-Sharing Support: Introducido en iOS 3.2, permite que los archivos de usuario estn
14
Las aplicaciones que permiten compartir archivos debe ser capazes de reconocer
cuando se han agregado archivos en el directorio de "Document" y responder
adecuadamente.
Grand Central Dispatch (GCD): Introducido en iOS 4.0, es una tecnologa a nivel BSD que
se utiliza para gestionar la ejecucin de tareas de la aplicacin. GCD combina un modelo
de programacin asncrona con un ncleo altamente optimizado para proporcionar una
conveniente (y ms eficaz) alternativa al "Threading". GCD tambin ofrece alternativas
convenientes para muchos tipos de tareas de bajo nivel, tales como leer y escribir
descriptores de archivo, implementar temporizadores, y monitorizar las seales de control
y los eventos del proceso.
In-App Purchase: Introducido en iOS 3.0, da la capacidad para vender contenidos y
servicios desde el interior de la aplicacin. Esta funcin se lleva a cabo usando el
framework "Store Kit", que proporciona la infraestructura necesaria para procesar las
transacciones financieras utilizando la cuenta del usuario en iTunes. La aplicacin se
encarga de la experiencia general del usuario y la presentacin de los contenidos o
servicios a la venta. En iOS 6, se ha aadido soporte para alojamiento de contenidos y
para la compra de contenidos de iTunes desde el interior de la aplicacin. Con el
alojamiento de contenidos, ahora se puede guardar el contenido descargable en los
servidores de Apple. Con la compra con iTunes, la aplicacin identifica los elementos que
se desea estn disponibles para la compra, pero el resto de la operacin es manejada
por el "Store Kit".
SQLite: La librera de SQLite permite incrustar una base de datos SQL ligera en su
aplicacin sin tener que ejecutar un proceso separado en un servidor remoto de base de
datos. Desde la aplicacin, se puede crear archivos de base de datos local y manejar las
tablas y registros en dichos archivos. La biblioteca est diseada para un uso general
pero est optimizada para proporcionar un acceso rpido a los registros de la base de
datos.
XML Support: el framework "Foundation" proporciona el la clase "Parser" NSXML para
poder recuperar elementos de un documento XML. Tambin tiene soporte para manipular
contenidos en XML a travs de la librera libXML2. Esta librera "Open Source" permite
"parsear" o escribir de manera arbitraria datos rpidamente en XML y transformar
contenido XML en HTML.
Frameworks del Core Services
En esta seccin se describen los frameworks de esta capa y los servicios que contienen.
Accounts Framework: Introducido en iOS 5, el framework de Cuentas
(Accounts.framework) proporciona un inicio de sesin nico para las cuentas de usuario.
Single sign-on mejora la experiencia del usuario, ya que las aplicaciones ya no tienen que
15
solicitar al usuario por separado los datos de registro relacionados con una cuenta.
Tambin simplifica el modelo de desarrollo para el programador de la gestin del proceso
de autorizacin en cuenta para la aplicacin. En iOS 5.0, las aplicaciones pueden utilizar
este framework, en relacin con el framework de Twitter para acceder a la cuenta de un
usuario de Twitter.
Address Book Framework: proporciona acceso a los contactos almacenados en el
dispositivo del usuario. Si la aplicacin utiliza la informacin de contacto, puede usar este
framework para acceder y modificar los registros en la base de datos de contactos del
usuario. En iOS 6 y versiones posteriores, el acceso a los contactos de un usuario
requiere el permiso explcito del usuario.
Ad Support Framework: Introducido en iOS 6, proporciona acceso a un identificador que
las aplicaciones pueden utilizar con fines publicitarios. Este framework tambin
proporciona una bandera que indica si el usuario ha optado por no seguimiento de
anuncios. Aplicaciones estn obligados a leer y aceptar la bandera con permisos antes de
intentar obtener acceso al identificador de publicidad
CFNetwork Framework: es un conjunto de interfaces de alto rendimiento basado en C que
utiliza abstracciones orientadas a objetos para trabajar con protocolos de red. Estas
abstracciones ofrecen un control detallado sobre la pila de protocolos y facilite el acceso
a construcciones de bajo nivel como los sockets BSD. Se puede utilizar para simplificar
tareas tales como la comunicacin con servidores FTP y HTTP o resolver DNS. Con el
framework CFNetwork, puede:
Core Data Framework: Introducido en iOS 3.0, es una tecnologa para la gestin del
modelo de datos de una aplicacin de Modelo-Vista-Controlador. Est diseado para uso
en aplicaciones en las que ya est el modelo de datos altamente estructurado. En lugar
de definir estructuras de datos mediante la programacin, se utiliza las herramientas de
Xcode para construir un esquema que representa el modelo de datos. Mediante esta
gestin del modelo de datos se reduce significativamente la cantidad de cdigo que se
tiene que escribir. Tambin proporciona las siguientes caractersticas:
Apoyo a la propagacin de los cambios y asegurar que las relaciones entre los
objetos sigan siendo coherentes
16
Manejo de "Strings"
Gestin de Preferencias
Hilos y bucles
Event Kit Framework: Introducido en iOS 4.0, proporciona una interfaz para acceder a los
eventos del calendario en el dispositivo del usuario. Se pueden obtener eventos
existentes y aadir nuevos eventos al calendario del usuario. Los eventos del calendario
pueden incluir alarmas configurables con las reglas de cundo deben ser entregadas. En
iOS 6, se ha aadido soporte para la creacin y el acceso a los recordatorios en el
dispositivo del usuario.
Foundation Framework: proporciona envoltorios o "Wrappers" en Objective-C de muchas
de las caractersticas que se encuentran en el framework Core Foundation.
Mobile Core Services Framework: Introducido en iOS 3.0, define los tipos de bajo nivel
utilizados en identificadores de tipo de uniformes (IU).
Newsstand Kit Framework: Introducido en iOS 5, Newsstand proporciona un lugar central
para que los usuarios lean revistas y peridicos. Los editores que deseen publicar su
revista y el contenido del peridico a travs de Newsstand pueden crear sus propias
aplicaciones para iOS utilizando el framework Kit (NewsstandKit.framework), que le
permite iniciar la descarga de fondo de la nueva revista y los contenidos de los diarios.
Despus de iniciar una descarga, el sistema se encarga de la operacin de descarga y
notifica a la aplicacin cuando el nuevo contenido est disponible..
Pass Kit Framework: Introducido en iOS 6, Kit Pass utiliza los servicios web, un nuevo
formato de archivo y un framework Objective-C (PassKit.framework) para implementar el
soporte para descargar tickets. Las empresas pueden crear tickets para representar
elementos, tales como cupones, tarjetas de embarque, boletos para eventos, y tarjetas de
descuento para las empresas. En lugar de llevar una representacin fsica de estos
elementos, los usuarios pueden almacenar en su dispositivo iOS y los utilizan de la misma
manera que antes.
Quick Look Framework: Introducido en iOS 4.0, proporciona una interfaz directa para
previsualizar el contenido de archivos que la aplicacin no soporta directamente. Este
framework est diseado principalmente para aplicaciones que descargan archivos desde
la red o que trabajan con archivos de fuentes desconocidas. Despus de obtener el
archivo, se utiliza el controlador de vista que ofrece este framework para mostrar el
contenido de ese archivo directamente en la interfaz de usuario.
Social Framework: Introducido en iOS 6, proporciona una interfaz sencilla para acceder a
las cuentas de redes sociales del usuario. Este framework sustituye al de Twitter que se
introdujo en iOS 5 y aade soporte para otras cuentas sociales, incluyendo Facebook y
Sina Weibo. Las aplicaciones pueden utilizar este framework para publicar actualizaciones
de estado e imgenes a una cuenta de usuario.
Store Kit Framework: Introducido en iOS 3, proporciona apoyo para la adquisicin de
contenidos y servicios desde las aplicaciones para iOS. Por ejemplo, se puede utilizar
esta funcin para permitir al usuario desbloquear caractersticas adicionales de la
aplicacin. O en un juego, se podra ofrecer niveles de juego adicionales. En ambos
casos, el framework Store Kit se encarga de los aspectos financieros de la operacin, el
procesamiento de las solicitudes de pago a travs de la cuenta del usuario en iTunes
Store y la disponibilidad para su solicitud con informacin acerca de la compra.
System Configuration Framework: proporciona interfaces de acceso, que se puede utilizar
para determinar la configuracin de red de un dispositivo. Puede utilizar este framework
para determinar si una conexin Wi-Fi o telefnica est en uso y si un servidor host en
particular es accesible.
Capa: Media Layer
Tecnologas de audio: Las tecnologas de audio disponibles en iOS estn diseadas para
ayudar a proporcionar una rica experiencia de audio para los usuarios. Esta experiencia
incluye la capacidad de reproducir audio de alta calidad, grabar audio de alta calidad, y
activar la funcin de vibracin en ciertos dispositivos. El sistema ofrece varias formas de
reproducir y grabar contenido de audio. Los frameworks de la siguiente lista se ordenan
de nivel alto a nivel bajo, el framework Media Player ofrece las interfaces de ms alto nivel
que puede utilizar. Al elegir una tecnologa de audio, recuerde que los frameworks de alto
nivel son ms fciles de usar y se prefieren en general. Frameworks de bajo nivel ofrecen
ms flexibilidad y control, pero requieren ms trabajo. Los frameworks de la siguiente lista
se ordenan de nivel alto a nivel bajo, el framework Media Player ofrece las interfaces de
ms alto nivel que puede utilizar. Al elegir una tecnologa de audio, recuerde que los
frameworks de alto nivel son ms fciles de usar y se prefieren en general. Los
frameworks de bBajo nivel ofrecen ms flexibilidad y control, pero requieren ms trabajo.
Framework Core Audio ofrece dos interfaces simples y sofisticados para reproducir
y grabar contenido de audio. Estas interfaces se utilizan para reproducir los sonidos
del sistema, la capacidad de vibracin de un dispositivo, y la gestin del
almacenamiento temporal y la reproduccin de contenido de audio multicanal local
o streaming.
Las tecnologas de audio en iOS compatible con los siguientes formatos de audio:
AAC, Apple Lossless (ALAC), A-law, IMA / ADPCM (ima4), Linear PCM, -law, DVI /
Intel ADPCM IMA, Microsoft GSM 6.10, AES3-2003
El framework "AV Foundation" proporciona un conjunto de interfaces de ObjectiveC para el manejo de la captura y la reproduccin de pelculas.
En Core Media se describen los tipos de datos de bajo nivel que utilizan los
frameworks de alto nivel y proporciona interfaces de bajo nivel para la manipulacin
de los medios de comunicacin.
AirPlay: AirPlay es una tecnologa que permite hacer streaming de audio hacia
Apple TV y altavoces AirPlay. El soporte de AirPlay est integrado en el framework
de AV Foundation y Core Audio . Cualquier contenido de audio que juega usando
estos frameworks se realiza automticamente elegible para la distribucin de
AirPlay. Una vez que el usuario decida reproducir el audio utilizando AirPlay, es
dirigida automticamente por el sistema. En iOS 5, los usuarios pueden reflejar el
contenido de un iPad 2 a un Apple TV 2 con AirPlay para cualquier aplicacin.Los
desarrolladores que quieran mostrar contenido diferente (en lugar de espejo) puede
asignar un objeto a una nueva ventana UIScreen y conectarla a un iPad 2 a travs
20
la siguiente seccin describe los frameworks de Media y los servicios ofrecidos en esta
capa:
Assets Library Framework: proporciona una interfaz basada en consultas para la
recuperacin de fotos y vdeos del dispositivo del usuario. El uso de este framework, se
puede acceder a los mismos ficheros que normalmente gestiona la aplicacin Fotos,
incluidos los elementos de lbum del usuario, fotos y vdeos de todos los que se
importaron en el dispositivo.
AV Foundation Framework: contiene las clases de Objective-C para la reproduccin de
contenido de audio. Se pueden reproducir varios sonidos simultneamente y controlar
varios aspectos de reproduccin de cada sonido. En iOS 3.0 y versiones posteriores, este
framework tambin incluye soporte para la grabacin de audio y la gestin de informacin
de la sesin de audio. En iOS 4.0 y versiones posteriores, los servicios que ofrece este
framework se han ampliado para incluir:
Core Audio: Soporte nativo para audio es proporcionada por la familia de frameworks
Core Audio , que se enumeran en la Tabla 2-1. Core Audio es una interfaz basada en C
que soporta la manipulacin de estreo basado en audio. Puede utilizar Core Audio en
iOS para generar, grabar, mezclar y reproducir audio en las aplicaciones. Tambin puede
utilizar Core Audio para activar la funcin de vibracin en los dispositivos que lo soporten.
21
Core Graphics Framework: contiene las interfaces de la API de dibujo de Quartz 2D.
Quartz es el mismo pero ms avanzado, dibujo vectorial y es el mismo motor de dibujo
que se utiliza en OS X. Proporciona soporte para dibujo basado en "Paths",
representacin suavizada (Anti-aliased), degradados, colores, transformaciones de
coordenadas espaciales, y creacin y visualizacin de documentos PDF. Aunque la API
est basada en C, utiliza abstracciones orientada a objetos para representar los
elementos fundamentales de dibujo, por lo que es fcil de almacenar y reutilizar su
contenido grfico.
Core Image Framework: Introducido en iOS 5, ofrece un potente conjunto de filtros
integrados para la manipulacin de vdeo e imgenes fijas. Se puede utilizar filtros
integrados para todo, desde operaciones simples (como retocar y corregir fotos) a las
operaciones ms avanzadas (como deteccin de rostro). La ventaja de utilizar estos filtros
es que operan de manera no destructiva a fin de que las imgenes originales no se
modifiquen directamente. Adems, Core Image aprovecha la CPU disponible y la
potencia de procesamiento de la GPU para asegurar que las operaciones son rpidas y
eficientes. La clase CIImage proporciona acceso a un conjunto estndar de filtros que se
utilizan para mejorar la calidad de una fotografa.
Core MIDI Framework: Introducido en iOS 4.2, proporciona una forma estndar de
comunicacin con dispositivos MIDI, como teclados y sintetizadores hardware. Este
framework se utiliza para enviar y recibir mensajes MIDI e interactuar con los perifricos
MIDI que estn conectados a un dispositivo basado en iOS usando el conector de la base
o de la red.
Core Text Framework: Introducido en iOS 3.2, contiene un conjunto simple de interfaces
de alto rendimiento basados en C para escribir texto y manipular las fuentes. Este
framework Core proporciona un motor de diseo de texto completo que se puede utilizar
para gestionar la colocacin del texto en la pantalla, las fuentes utilizadas y los estilos.
Este framework est diseado para su uso en aplicaciones que requieran sofisticadas
capacidades de manejo de texto, tales como aplicaciones de procesamiento de textos. Si
su aplicacin requiere uso de texto simple, es mejor utilizar las clases de texto existentes
en el framework UIKit.
Core Video Framework: proporciona soporte para "buffer" y "buffer pooll" en el framework
de Core Media.
Image I/O Framework: Introducido en iOS 4.0, proporciona interfaces para importar y
exportar datos de imgenes y metadatos de imagen. Este framework hace uso de los
grficos bsicos los tipos de datos y funciones y soporta todos los tipos de imgenes
estndar disponibles en iOS. En iOS 6 y versiones posteriores, puede utilizar este
framework para acceder a las propiedades EXIF e IPTC de metadatos para imgenes.
GLKit Framework: Introducido en iOS 5, contiene un conjunto de clases de Objective-C
que simplifican el esfuerzo necesario para crear una aplicacin OpenGL ES 2.0. GLKit
proporciona soporte para cuatro reas clave de desarrollo de aplicaciones:
Media Player Framework: proporciona soporte de alto nivel para la reproduccin de audio
y vdeo desde una aplicacin. Se puede utilizar este framework para reproducir vdeo
mediante una interfaz estndar del sistema. En iOS 3.0, se ha aadido soporte para el
acceso a la biblioteca del usuario en iTunes msica. Con este soporte, pueden reproducir
pistas de msica y listas de reproduccin, buscar canciones, y presentar una interfaz para
seleccionar los medios. En iOS 3.2, se han realizado cambios para la reproduccin de
vdeo desde una ventana de tamao variable. Adems, se han aadido numerosas
interfaces para configurar y gestionar de la reproduccin de vdeos. En iOS 5, se ha
aadido funcionalidad para la visualizacin de "Reproduccin en curso". Esta informacin
tambin se puede visualizar en un Apple TV a travs de AirPlay. Tambin hay interfaces
para detectar si el vdeo se est transmitiendo a travs de AirPlay.
OpenAL Framework: es un estndar multiplataforma para enviar audio posicional en las
aplicaciones. Se puede utilizar para implementar audio de alto rendimiento y alta calidad
en juegos y otros programas que requieren salida de audio posicional. OpenAL es un
estndar entre plataformas, el cdigo de los mdulos en iOS puede ser portado a otras
plataformas fcilmente.
OpenGL ES Framework: proporciona herramientas para dibujar contenidos en 2D y 3D.
Se trata de un framework basado en C que trabaja en estrecha colaboracin con el
hardware del dispositivo para proporcionar alta velocidad de fotogramas. El framework
OpenGL se utiliza junto con las interfaces EAGL. Estas interfaces son parte del framework
de OpenGL ES y proporcionan la interfaz entre el cdigo de dibujo OpenGL ES y los
objetos de ventana nativos definidos por UIKit.
Quartz Core Framework: contiene las interfaces Core Animation. Core Animation es una
tecnologa avanzada animacin y de composicin que utiliza una ruta de reproduccin
optimizada para ejecutar complejas animaciones y efectos visuales. Core Animation se
integra en muchas partes de iOS, incluyendo las clases UIKit como UIView,
proporcionando animaciones para muchos comportamientos estndar del sistema.
Tambin puedos utilizar la interfaz Objective-C en este framework para crear animaciones
personalizadas.
reglas expresan una clase ms amplia de relaciones y son ms intuitivas de usar que
lossprings and struts". Por ejemplo, se puede especificar que un botn siempre debe
tener 20 micras desde el borde izquierdo de la vista padre. Las entidades usadas en Auto
Layout automtico son objetos Objective-C llamados restricciones (constrains). Este
enfoque le ofrece una serie de ventajas:
Storyboards: Introducido en iOS 5, los storyboards sustituyen a los archivos nib como la
forma recomendada para el diseo de la interfaz de usuario de la aplicacin. A diferencia
de los archivos nib, los storyboards permiten disear la interfaz de usuario completa en un
solo lugar para que se puedan ver todas las vistas, controladores y cmo trabajan juntos.
Una parte importante de los storyboards es la capacidad de definir segues, que son las
transiciones desde una vista hacia el controlador. Se pueden definir estas transiciones
visualmente en Xcode o mediante programacin en Xcode. Estas transiciones permiten
capturar el flujo de su interfaz de usuario, adems de los contenidos. Se puede utilizar un
archivo de storyboard nico para almacenar todos los controladores de vista y vistas, o se
pueden utilizar mltiples storyboards de vistas para organizar las partes de la interfaz. Al
momento de la construccin, Xcode toma el contenido del archivo de storyboardy lo divide
en trozos que se pueden cargar de forma individual para un mejor rendimiento. Las
aplicaciones no necesitan manipular estas piezas directamente, sin embargo. El
framework UIKit ofrece clases de conveniencia para acceder a los contenidos de un guin
grfico desde el cdigo.
Document Support: Introducido en iOS 5, el framework UIKit introdujo la clase
UIDocument para la gestin de los datos asociados a los documentos del usuario. Esta
clase realiza la implementacin de aplicaciones basadas en documentos mucho ms fcil,
especialmente las aplicaciones que almacenan documentos en iCloud. Adems de
proporcionar un recipiente para todos los datos relativos a los documentos, la clase
UIDocument ofrece soporte integrado para lectura y escritura asncrona de datos de
archivo, archivo seguro de datos, archivo automtico de datos, soporte para la deteccin
de conflictos iCloud, y el soporte para archivos planos o representaciones de paquetes de
archivos. Para las aplicaciones que utilizan los datos bsicos en su modelo de datos, se
puede utilizar la subclase UIManagedDocument para administrar almacenes de datos.
Multitasking: Las aplicaciones creadas con iOS SDK 4.0 o posterior (en funcionamiento en
iOS 4.0 y posteriores) no se cierran cuando el usuario pulsa el botn Inicio, en cambio,
cambian a un contexto de ejecucin en segundo plano. El soporte multitarea definido por
UIKit ayuda a la aplicacin hacia una transicin hacia y desde el estado de fondo sin
problemas. Para preservar la vida de la batera, la mayora de las aplicaciones son
suspendidas por el sistema poco despus de entrar en el background. La solicitud de
suspensin permanece en la memoria pero no ejecuta ningn cdigo. Este
24
Una aplicacin puede solicitar una cantidad finita de tiempo para completar una
tarea importante.
Una aplicacin puede declararse como soporte de servicios especficos que
requieren tiempo regular ejecucin en segundo plano.
Una aplicacin puede utilizar notificaciones locales para generar alertas de usuario
en los horarios establecidos, si la aplicacin se est ejecutando.
Independientemente de si una aplicacin se suspende o contina funcionando en
segundo plano, el soporte de la multitarea requiere trabajo adicional. El sistema
avisa a la aplicacin de las transiciones hacia y desde el background. Estos puntos
de notificacin son seales para realizar tareas en aplicaciones importantes, como
guardar los datos de los usuarios
Printing: Introducido en iOS 4.2, el soporte de impresin UIKit permite a las aplicaciones
enviar contenido de forma inalmbrica a impresoras cercanas. En su mayor parte, UIKit
hace todo el trabajo pesado asociado con la impresin. Gestiona las interfaces de
impresin, trabaja con su aplicacin para representar el contenido imprimible, y se
encarga de la programacin y la ejecucin de los trabajos de impresin en la impresora.
Los trabajos de impresin enviados por la aplicacin son manejados por el sistema de
impresin, que gestiona el proceso de impresin. Los trabajos de impresin de todas las
aplicaciones en un dispositivo estn en la cola y se imprimen en orden de llegada, . Los
usuarios pueden ver el estado de los trabajos de impresin desde la aplicacin Centro de
impresin y puede incluso utilizar esa aplicacin para cancelar los trabajos de impresin.
Todos los dems aspectos de la impresin se manejan de forma automtica por el
sistema.
UI State Preservation: Introducido en iOS 6, estado de conservacin hace que sea ms
fcil para las aplicaciones restaurar la interfaz de usuario al estado en que se encontraba
cuando el ltimo usuario la utiliz. Cuando una aplicacin pasa a un segundo plano, se le
pide que guarde el estado de sus vistas y controladores de visualizacin. Al reiniciar, la
aplicacin utiliza este estado para restaurar la interfaz y hacer que parezca como si la
aplicacin nunca hubiera pasado a segundo plano. UI State Preservation se integra en
UIKit, que proporciona la infraestructura para guardar y restaurar la interfaz de su
aplicacin.
Apple Push Notification Service: Introducido en iOS 3.0, el Apple Push Notification Service
proporciona una forma de alertar a los usuarios de que hay nueva informacin, incluso
cuando la aplicacin no est ejecutndose. El uso de este servicio, puede enviar
notificaciones de texto, aadir una divisa a un icono o activar alertas audibles en los
dispositivos de usuario en cualquier momento. Estos mensajes son para que los usuarios
sepan que deben abrir la aplicacin para recibir la informacin relacionada.
os usuarios.
Local Notification: Introducido en iOS 4.0, notificaciones locales complementa el
mecanismo de notificacin push existentes, proporcionando una va para de generacin
25
tambin asegura que la aplicacin utiliza las mismas interfaces que las dems solicitudes,
garantizando as la coherencia en la plataforma.
Event Kit UI Framework: Introducido en iOS 4.0, proporciona controladores para ver la
presentacin de las interfaces de sistema estndar para la visualizacin y edicin de
eventos relacionadas con el calendario.
Game Kit Framework: Introducido en iOS 3.0, permite aadir capacidades peer-to-peer de
red para las aplicaciones. En concreto, este framework proporciona soporte para
conexiones peer-to-peer y el juego de funciones de voz. Aunque estas caractersticas se
encuentran ms comnmente en los juegos multijugador de red, tambin se pueden
incorporar en las aplicaciones que no sean juegos. El framework proporciona funciones de
red a travs de un simple (pero potente) conjunto de clases construidas en la parte
superior de Bonjour. Para desarrolladores que pueden no tener experiencia en la
programacin en red, el framework permite incorporar funciones de red en sus
aplicaciones.
Introducido en iOS 4.1, Game Center es una extensin del framework Game Kit que
proporciona soporte para las siguientes funciones:
Alias, para permitir a los usuarios crear su propio personaje en lnea. Los usuarios inician
sesin en el Centro de Juego e interactuar con otros jugadores de forma annima a travs
de sus alias. Los jugadores pueden configurar mensajes de estado, as como marcar
determinadas personas como sus amigos.
Tablas de clasificacin, para permitir su aplicacin para publicar puntuaciones de los
usuarios de Game Center y recuperarlos ms tarde. Puede utilizar esta caracterstica para
mostrar los mejores resultados entre todos los usuarios de la aplicacin.
Matchmaking, que le permite crear partidas multijugador mediante la conexin de los
jugadores que han iniciado sesin en Game Center. Los jugadores no tienen que ser
locales entre s para unirse a una partida multijugador.
Logros, que le permiten registrar el progreso de un jugador ha hecho en su juego.
Desafos, permiten a un jugador para desafiar a un amigo a batir un logro o resultado.
(IOS 6 y versiones posteriores)
En iOS 5 y versiones posteriores, se puede utilizar la clase GKTurnBasedMatch para
implementar el soporte para juegos por turnos, lo que permite a los juegos para crear
partidas persistentes cuyo estado se almacena en iCloud. El juego maneja la informacin
de estado para la partida y determina qu jugador debe jugar para seguir la partida
iAd Framework: Introducido en iOS 4.0, permite mostrar anuncios basados en banners en
la aplicacin. Los anuncios se integran en la aplicacin y se muestran cuando sea
necesario. Las vistas trabajan con el servicio de anuncios de Apple que se encarga del
manejo del anuncio.
Map Kit Framework: Introducido en iOS 3.0, proporciona una interfaz de mapa con scroll
que se puede integrar en las jerarquas de vistas existentes en la aplicacin. Este mapa
proporciona direcciones o resalta puntos de inters.La aplicacin puede establecer los
atributos del mapa o permitir al usuario navegar por el mapa libremente. Tambin puede
anotar el mapa con imgenes personalizadas o contenido. En iOS 4.0, la vista del mapa
bsico obtuvo el soporte para anotaciones y plantillas personalizadas. En iOS 6.0, ahora
se puede crear una aplicacin para enrutamiento, cuyo trabajo consiste en orientar a los
usuarios. Cuando el usuario solicita una direccin, la aplicacin Maps ahora permite al
27
Multitarea apoyo
Los objetos que presentan las vistas del sistema y controles estndar
28
Creacin de PDF
Soporte para el uso de vistas personalizadas que se comportan como el teclado del
sistema
Estado de la batera
29
XCODE
Xcode es el entorno de programacin para Apple tanto para dispositivos mviles como
para Mac. Para crear una aplicacin en iOS, necesitaramos Xcode 4.3 o posterior. Xcode
debe instalarse para su ejecucin en un entorno Mac, al instalar Xcode en el Mac, se
consigue el SDK de iOS, que incluye las interfaces de programacin de la plataforma iOS.
Fuente:
http://developer.apple.es
30
31
Cdigo fuente
Proyectos y configuraciones
Archivos de propiedades
Archivos .rtf
Modelos del Core Data
Modelos de mapeado de Core Data
Archivos de interfaz de usuario (User interface (nib))
Archivos de script de Apple
Archivos de diccionario de script
32
Editar la configuracin
En el rea de edicin se pueden modificar, aadir o crear propiedades de los objetos del
proyecto.
Si al crear un nuevo proyecto seleccionamos Use Core Data indicamos al proyecto que
vamos a utilizar el framework Core Data, Xcode a travs del editor de Data Model
nos permite disear mediante entorno grfico las propiedades y los objetos en el modelo
vista controlador. El manejador del modelo de objetos nos representa un esquema que
describe los objetos de nuestro modelo incluyendo las relaciones entre ellos.
Definir reglas de trasformacin en la migracin delos datos del modelo
El mapeo del modelo de objetos describe las transformaciones necesarias para convertir
los datos descritos por un modelo de datos a otro modelo con un esquema diferente.
En las primeras versiones de Xcode Apple inclua una herramienta llamada Interface
Buider para el diseo grfico de la interfaz de usuario. Actualmente esa herramienta est
integrada junto con el resto de editores en la ventana de trabajo Workspace window de
Xcode.
Los ficheros que contienen las definiciones y objetos de la interfaz tiene extensin .nib
34
35
Bsqueda de texto
Xcode nos permite realizar bsqueda de texto libre en los recursos del proyecto.
Visualizacin de alertas
36
Xcode graba determinadas acciones realizadas por el usuario como la creacin o anlisis
de errores mediante debug, esto permite tener un histrico de dichas tareas.
37
Las bibliotecas que se visualizan en la parte inferior del rea de servicios pblicos (Ver
figura ) proporcionan plantillas de archivos y fragmentos de cdigo que se pueden
arrastrar en el proyecto o espacio de trabajo, elementos de interfaz de usuario que se
pueden utilizar en Interface Builder, y archivos multimedia (grficos, archivos de sonido,
etc) que se utilizan en el espacio de trabajo.
38
Xcode tiene dos ventanas principales. Hemos visto la ventana de trabajo (ver figura
siguiente), que se utiliza para la edicin, depuracin, y el diseo de la interfaz.
39
para poder activar un proyecto en Xcode tendremos que realizar los siguientes pasos
1.- Seleccionar Archivo> Nuevo> Nuevo proyecto.
2.- Seleccionar la plantilla o tipo de proyecto para su iOS o producto OS X y hacer clic en
Siguiente.
40
3.- Introducir el nombre del programa y otros detalles del proyecto y hacer clic en
Siguiente.
4.- Especificar la ubicacin del proyecto en el sistema de archivos y hacer clic en Guardar
41
Ms caractersticas de Xcode
Interfaz en ventana nica: la mayor parte de los flujos de trabajo del desarrollo se realizan
en una nica ventana.
Interfaz para el diseo de objetos grficos: con el editor de interfaz de usuario de Xcode,
llamado Interface Builder, se disean la mayora de los detalles de la interfaz de usuario
de una aplicacin, tales como el diseo de los controles, y la conexin con la lgica de
negocio y los datos que maneja la aplicacin. Interface Builder trabaja en estrecha
colaboracin con otros editores, como el editor de cdigo fuente, que conecta el diseo
con el comportamiento de la aplicacin.
Edicin asistida: Cuando se necesita trabajar en diferentes aspectos de un mismo
componente, como el diseo de la interfaz de usuario y la implementacin de la
funcionalidad se pueden utilizar varios editores que abren el contenido necesario cuando
lo necesita. Por ejemplo, cuando se trabaja en un archivo de implementacin en el editor
principal, Xcode puede abrir el archivo de cabecera correspondiente en un panel de
edicin secundaria.
Correccin e Identificacin automtica de errores. Xcode comprueba el cdigo fuente
mientras este se est escribiendo. Cuando Xcode descubre un error, el editor de cdigo
fuente lo destaca. A continuacin, el programador recibe informacin del error para que
pueda subsanarlo.
Control del cdigo: se puede proteger los archivos del proyecto en los repositorios Git
Subversion y el cdigo fuente.
Espacios de trabajo (Workspaces)
42
Actualizacin de proyectos
Xcode evala si un proyecto tiene actualizada todos sus libreras y productos, si detecta
que no y ayuda al usuario a actualizarlo. Esa caracterstica permite que el proyecto tenga
las ltimas actualizaciones del SDK las mejores prcticas.
ARC (automatic reference counting)
Xcode en versin 4.2 o posterior incluye ARC que sirve para que los objetos de ObjectiveC gestionen la memoria de manera ms eficiente. En primer lugar, Xcode revisa el
proyecto para determinar si hay elementos que no se pueden convertir (y que por lo tanto
debe cambiar manualmente). Entonces, Xcode vuelve a escribir su cdigo fuente para
utilizar ARC. (Para aadir ARC a un nuevo proyecto, consultar "Opciones de Seleccionar
al crear un nuevo proyecto.")
43
Lenguaje dinmico
La gran diferencia con el resto de lenguajes de programacin es que ste es un lenguaje
dinmico, es decir muchas decisiones sobre el programa se toman en tiempo de
ejecucin. De esta forma las herramientas de desarrollo tienen acceso a todo el runtime
del programa y el programador tiene un control ms extenso sobre dicho programa y sus
objetos.
Los dinamismos implementados en objective-C son los siguientes:
Introspeccin
Es la caracterstica de algunos lenguajes de observar y manipular como si fueran datos el
estado de su ejecucin. De esa forma en tiempo de ejecucin se puede preguntas a un
objeto de que clase es o que protocolos implementa.
Enlace dinmico
Se enlazan los mensajes con las clases de los objetos que responden a ese mensaje de
manera dinmica.
44
Memoria dinmica
La memoria necesaria para la creacin de objetos se realiza en tiempo de ejecucin, de
esa forma se evita el desbordamiento de la pila.
Tipos dinmicos
Se deja al runtime del programa decidir de que tipo es cierta variable.
Carga dinmica
Consiste en cargar un conjunto bsicos de clases al ser ejecutado e ir cargando el resto
segn se vayan utilizando en la ejecucin.
Asociaciones: la conexin y la agregacin
Una asociacin es un tipo de relacin entre dos objetos. Esta relacin puede ser:
Extrnseca: asociaciones en donde los objetos no se dominan entre s, peer-to-peer
Intrnseca: uno de los objetos domina sobe el otro:
Composicin: la vida de un objeto depende y est asociada a la de su contenedor o
propietario
Agregacin: la vida de un objeto no est limitada a la de su contenedor
El Interface Builder permite guardar en ficheros .nib los grafos de relacin entre los
objetos, de esta forma se cargarn en memoria en tiempo de ejecucin. EL grafo tambin
guarda las conexiones entre los objetos.
Conexiones :
Componentes y Frameworks
La mayora de los lenguajes de programacin modernos se apoyan en una gran cantidad
de libreras realizadas para ahorrar tiempo a la programacin. No obstante el mayor
tiempo que pasa un programador en el aprendizaje del lenguaje es aprendiendo el
conjunto de clases y funcionalidades desarrolladas en esas libreras. Dichas libreras se
pueden desarrollar de estas dos formas:
La diferencia ms significativa entre estos dos modelos es que la librera deja mucha
libertad al programador que es quien establece las relaciones entre los objetos y clases
de la aplicacin. Por otra parte los frameworks al ser ms estructurados permiten que un
nuevo programador entienda el cdigo mucho ms rpido ya que estar escrito de una
forma ms ordenada.
Clases
Una clase est formada por las definiciones de las propiedades y comportamiento de un
tipo de objeto concreto. (Un objeto es un agregado de datos y de mtodos que permiten
manipular dichos datos).
Las clases en Objective-C estn construidas por la interfaz que indica la estructura de un
objeto y la implementacin que contiene el comportamiento de los mtodos de dicho
objeto.
La interfaz de una clase est contenida en un fichero de extensin .h el cdigo fuente de
este fichero debe estar abierto para que o utilicen los programadores.
La implementacin de una clase est contenida en un fichero de extensin .m, este
fichero puede entregarse compilado a los programadores.
Se recomienda poner una implementacin y una interfaz en cada fichero, no obstante se
pueden incorporar varias implementaciones en un solo fichero. Tambin como en C++ un
fichero de implementacin puede incorporar la interfaz y la implementacin a la vez.
La interfaz
Normalmente la interfaz comienza con las clases que se importan o que hace referencia
#import.
En este caso NSObject , la clase se denomina fraction y hereda de NSObjetc.
X e Y son los atributos que al no poner de que tipo (@protected, @public o @private)
toma por defecto @protected. Los mtodos declarados tienen la siguiente estructura:
alcance (Tipo devuelto) nombre del mtodo : (parmetro y tipo) nombre del parmetro.
Hay que tener en cuenta que
en Objective-C las variables de
instancia no pueden ser
objetos sino punteros a
objetos, adems no pueden
ser compartidas entre clases,
para
tener
una
variable
compartida
habra
que
declararla una esttica o global
en el mdulo. Para tener una
variable
esttica
pblica
deberamos definirla en el
mdulo
y
hacer
una
declaracin extern
en
la
46
interfaz.
La implementacin
47
Objetos
Los objetos se crean en la memoria dinmica por lo que slo se pueden referenciar a
travs de punteros.
Es decir punto* p;
Por lo tanto las funciones no se pasan por valor si no por referencia, si indicamos que p es
un objeto de la clase Punto significa que es un puntero a dicha clase.
Instanciar Objetos
48
De esta forma podemos utilizar los objetos en Objective-C, la diferencia es que cuando
utilicemos puntero esttico a objetos el compilador comprueba que existe el objeto
mientras que si usamos un puntero a n objeto esttico es el runtime quien lo comprueba,
por lo que si no existiese se producira una excepcin.
La ventaja de trabajar con punteros a 0bjetos dinmicos es que se podr trabajar con
objetos polimrficos.
Objective-C adems del identificador Null tiene las palabras reservadas nil (puntero a
objeto sin inicializar) y Nill (puntero a clase o metaclase sin inicializar)
Variables de instancia
Los objetos pueden contener variables, que pueden ser variables simples u objetos de
cualquier clase. Las variables de instancia son diferentes en cada objeto, por lo que si
tenemos dos objetos de la clase punto y accedemos a la variable x, cada uno devolver
un valor diferente.
Las variables de instancia deben declararse en la interfaz, por lo que no se pueden aadir
variables de instancia en la implementacin. Para acceder a una variable de instancia hay
que aadir la flecha, ejemplo
Punto* ps = [punto New];
Ps x = 3;
Las variables de instancia son @protected es decir protegidas, por lo que no son
accesibles fuera del objeto. Para acceder a una variable dentro de un mtodo se utilizar
self o no se pondr nada, ejemplo:
X=3
Self x = 3
El operador flecha slo se puede usar con punteros a objetos estticos, si fueran
dinmicos slo se podran utilizar a travs de mtodos setter y getter.
Este cdigo dara error:
Id pd = [punto New];
Pd x= 3; error de compilacin
[pd setx: 3]; esto sera correcto
Los mtodos
Los mtodos son funcionalidades que se asocian a un objeto, estos pueden utilizarse para
49
cambiar las propiedades del objeto o tambin para que el objeto realice determinadas
acciones. En Objective-C para ejecutar un mtodo se le enva un mensaje al objeto. El
mtodo a ejecutar depender del mensaje y se realizar siempre en tiempo e ejecucin.
Declaracin de un mtodo
Un mtodo tiene tantos parmetros como veces escribamos el smbolo de dos puntos.
Despus de los dos puntos debemos indicar, obligatoriamente, el tipo del parmetro (entre
parntesis) y un nombre para ese parmetro. Si el mtodo no tuviese parmetros no
debemos escribir ningn smbolo de :.
Pueden existir mtodos como el init del ejemplo que o reciben ningn parmetro.
Implementacin de un mtodo
Ejecucin de un mtodo
Si ejecutamos un mtodo deber existir el receptor que ser una clase o un a instancia de
una clase y el nombre del mtodo.
Para ejecutarlo se incluye el nombre del objeto receptor y el mtodo entre corchetes: [p
setX:4 Y:3];
Si el mtodo tiene parmetros se metern separados por espacios.En el caso de que se
llame al mtodo con n nmero variable de parmetros, estos se separan con comas.
Ejemplo de interfaz: + (punto*) suma: NSInteger n, ..; los puntos indican que ah van un
nmero indeterminado de parmetros. La llamada sera: punto* p3= [punto suma: 2, 1,
p1];
Una llamada a un mtodo es una expresin por lo que si el mtodo devuelve un valor ste
se puede asignar a una variable. Ejemplo:
NSInteger ancho = [p x];
Las llamadas a mtodos se pueden anidar. Ejemplo: [p2 setX: [p x] ];
Encapsulacin
Para ocultar las variables de instancia de un objeto se deben usar los modificadores de
acceso en la declaracin de estas, estos indicadores son:
@protected: la variable es vivible solo dentro del objeto pero tambin es visible
dentro de una clase derivada.
@public: variable accesible desde cualquier parte del programa.
@private: la variable es visible dentro del objeto nicamente.
NsiInteger dia;
NSInteger mes;
NSIntegar anyo;
}
@end
Como la clase carece de mtodos no hace falta implementarla. Como no se realiza la
implementacin no podremos utilizar el mtodo new para crear el objeto, as que lo
crearemos de esta forma: Fecha* f= (Fecha*) malloc (sizeof (Fecha)); f-->x = 3; free(d);
Cadenas de caracteres
Se utilizan los tipo de caracteres Char*para cadenas acabadas en cero y para objeto tipo
strings se usan:
52
Tipos de Datos
Hay varios tamaos para los tipos de datos de Objective-C. Dependiendo del convenio
elegido el tamao ser distinto. ILP32 para 32 bits y ILP64 para 64 bits.
Herencia
La herencia es un concepto asociado con la <programacin Orientada a Objetos,
bsicamente se pueden declarar clases que heredan de otra funcionalidad y datos. En
algunos casos la clase hija modifica o aade alguna funcionalidad de la que tiene la
madre.
Ejemplo de herencia:
/* Punto.h */
#import <Foundation/Foundation.h>
@interface Punto : NSObject {
NSInteger x;
NSInteger y;
}
- init;
+ (NSString*)sistema;
- (NSInteger)x;
- (void)setX:(NSInteger)paramX;
- (void)setX:(NSInteger)paramX
incrementando:(NSInteger)paramSumar;
- (NSInteger)y;
- (void)setY:(NSInteger)paramY;
53
- (void)setY:(NSInteger)paramY
incrementando:(NSInteger)paramSumar;
- (void)setX:(NSInteger)paramX Y:(NSInteger)paramY;
+ (Punto*)suma:(Punto*)p1 :(Punto*)p2;
+ (Punto*)suma:(NSInteger) n ,...;
- (void)dealloc;
@end
Indicamos que la clase Punto hereda de la clase NSObject (base de las clases en Cocoa
Touch).La clase base solo se indica en el fichero de interfaz.
Todas las clases en Objective-C derivan de la clase raz. EN el caso de Cocoa Touch es
NSObject.
Objective-C nos permite redefinir (override) mtodos en la clase derivada volviendo a
definir un mtodo con el mismo prototipo. Para redefinir un mtodo heredado no hace falta
declararlo en la interfaz de la clase derivada (aunque es conveniente por claridad), basta
con declararlo en la implementacin. Esta es una diferencia con C++ donde para poder
redefinir un mtodo es necesario declararlo tanto en la interfaz como en la
implementacin.
En Objective-C no se pueden redefinir las variables de instancia, es decir, no podemos
volver a declarar una variable de instancia con el mismo nombre (aunque tenga distinto
tipo) en la clase derivada .
54
Objetos de Clases
La definicin de una clase contiene varios tipos de informacin
El nombre de la clase y de su superclase,
los nombres de los mtodos,
su retorno,
sus parmetros, y
su implementacin.
Toda esta informacin es recopilada por el compilador y guardada en estructuras de datos
que son usadas por el runtime de Objective-C.
El compilador crea un objeto clase por cada clase que tenga el programa, donde en
tiempo de ejecucin se almacena informacin sobre la clase. Estos objetos son
inicializados por el runtime antes de que el programa empiece su ejecucin, con lo que
estn siempre disponibles.
Para acceder al objeto clase disponemos de los mtodos de clase y de instancia:
+ (Class)class
(Class)class
El mtodo de clase se ejecuta sobre el nombre de la clase, y se limita a devolver self, con
lo que para obtener el objeto clase de Punto podemos hacer:
id c = [Punto class];
El mtodo de instancia se puede ejecutar tanto sobre un objeto de instancia, como sobre
un objeto clase. Por ejemplo, para obtener el objeto clase de un Punto podemos hacer:
Punto* p = [Punto new];
id c = [p class];
Pero tambin podemos ejecutar el mtodo class directamente sobre el objeto clase:
id c2 = [c class];
Donde se cumple que c==c2. Esto se debe a que al recibir el mensaje class el objeto
clase, primero busca su implementacin en sus mtodos (los mtodos de clase), y luego
en los mtodos de la clase base (los mtodos de instancia de la clase raz). Como el
mtodo de clase class es un mtodo del objeto clase, se ejecuta y devuelve self.
Las clases son la forma ms importante de asociar mtodos a objetos, pero no la nica.
En los siguientes apartados veremos otras formas de declarar mtodos y asocirselos a
objetos:
1.- Las categoras, que nos permiten dividir una clase en partes, o bien extender su
funcionalidad,
2.- los protocolos, que nos permiten declarar mtodos que pueden ser implementados por
varias clases
55
3.- las extensiones, que nos permiten aadir mtodos a una clase para uso exclusivo del
framework al que pertenece la clase.
Categoras
Las categoras nos permiten modificar una clase ya existente aunque no dispongamos de
su cdigo fuente. La diferencia que hay entre las herencia y la categorizacin es que la
herencia slo nos permite crear nuevas hojas en la jerarqua de clases, mientras que la
categorizacin nos permite modificar nodos interiores de la jerarqua de clases.
Al igual que la herencia tiene varias finalidades (reutilizacin, clasificacin, ...), la
categorizacin tambin tiene al menos cuatro finalidades:
1. Las categoras se pueden usar para implementar una clase en distintos ficheros de
cdigo fuente. Esto nos permite particionar una clase en grupos de mtodos relacionados,
lo cual por ejemplo, reduce el tiempo de compilacin de una clase grande al slo compilar
el fichero de la categora modificada. Dividir la clase en varias categoras tambin podra
permitir repartir el trabajo de implementacin de la clase entre varios programadores.
2. Las categoras permiten aadir a las clases de libreras de otros fabricantes mtodos
que nos hubiese resultado especialmente til que tuviesen, pero que le fabricante de la
librera no meti. Por ejemplo, con las categoras podemos aadir mtodos a clases de la
librera Cocoa sin necesidad de crear una derivada. Los mtodos aadidos a la clase son
automticamente heredados por las subclases, y en tiempo de ejecucin son
indistinguibles de los mtodos de la clase. Es muy tpico crear categoras que aaden
nuevos mtodos (p.e. mtodos de bsqueda) a las clases que implementan colecciones
como NSArray.
3. Otra ventaja de las categoras es que permiten diferenciar entre un API pblica y un API
para el framework. De esta forma podemos crear dos versiones de nuestra clase: una con
un conjunto de mtodos pblicos que todo el mundo puede usar, y otra con mtodos
aadidos destinados a uso exclusivo para nuestro framework.
4. Una cuarta finalidad de las categoras es declarar protocolos informales.
Protocolos
La interfaz de una clase o categora declara mtodos asociados con una clase en
particular. Por el contrario, los protocolos declaran mtodos no asociados con ninguna
clase, sino que cualquier clase o conjunto de clases pueden implementar. Segn esto, los
protocolos nos permiten indicar que un conjunto de clases no relacionadas comparten un
conjunto de mtodos comunes. Por ejemplo, un conjunto de clases que representen
objetos de interfaz grfica podran compartir los mtodos:
- (void)mouseDown:(NSEvent*)theEvent;
- (void)mouseDragged:(NSEvent*)theEvent;
- (void)mouseUp:(NSEvent*)theEvent;
Se dice que una clase cumple, adopta o implementa un protocolo si dispone de mtodos
56
que reciben los mensajes del protocolo. De esta forma los protocolos nos permiten
separar la jerarqua de clases del hecho de compartir funcionalidad comn. El objetivo es
que los objetos se pueden agrupar, no slo por su jerarqua, sino por los protocolos que
adoptan.
Extensiones
Anteriormente indicamos que los mtodos en Objective-C slo pueden ser de dos tipos:
Pblicos cuando se declaran en la interfaz de la clase (y se implementan en su
implementacin), y privados cuando slo aparecen en la implementacin de la clase. Los
mtodos privados slo deben ser llamados desde la clase donde se sitan. En el apartado
5 del Tema 3 tambin indicamos que los mtodos privados de una clase deban
declararse en el fichero de implementacin siempre antes que los mtodos pblicos, o en
caso contrario obtendramos un warning al llamar al mtodo privado desde el pblico. Las
extensiones (introducidas en Objective-C 2.0) nos permiten implementar mtodos
privados ignorando esta regla.
Las extensiones son parecidas a las categoras pero con tres diferencias:
1. Son "annimas", es decir, no se las asigna un nombre. Una clase puede tener varias
extensiones, pero todas ellas sern annimas.
2. Se aconseja declarar la interfaz de la extensin en el fichero de implementacin de la
clase a la que extiende, en vez de en un fichero de interfaz como ocurre con las
categoras.
3. Sus mtodos se implementan en la implementacin de la clase a la que extienden, en
vez de usar una seccin @implementation distinta como ocurre con las categoras.
57
Modelo-Vista-Controlador
Los programadores que desarrollaron Cocoa Touch usaron un concepto conocido como
Modelo-Vista-Controlador (MVC) como base para el codigo de las aplicaciones de iPhone
e iPad.
Divide los objetos o partes del programa en tres partes independientes pero conectadas.
Esta es la idea basica:
Modelo: contiene los datos y las clases que hacen que la aplicacion funcione. Es la
parte del programa donde se encuentran las secciones de codigo que resuelve los
requerimientos del programa. Este codigo tambien puede contener objetos que
representen elementos que podrias tener en tu aplicacion (por ejemplo nombres en
bases de datos, citas en tu calendario).
Vista: controladores subordinados e interfaces genricas re utilizables, objetos que
se utilizan para determinados trabajos y los responsables de cmo se ve el modelo
en la pantalla. Esta es la combinacion de todas las pantallas que los usuarios ven
cuando usan tu aplicacion. Son los objetos con los que el usuario interacta:
botones, barras de desplazamiento, controles.
Controlador: El controlador conecta el modelo y la vista controlando lo que el
usuario esta haciendo. Es la espina dorsal de la aplicacion. Nos sirve para
coordinar los botones las pulsaciones del usuario y, si es necesario, el cambio de
una vista por otra, todo en respuesta a los datos, reacciones, entradas etc. del
usuario.
Controlador
Vista
Modelo
58
Outlet son punteros hacia las vistas para saber a cual estamos preguntando.
Controlador
O
ut
le
t
Vista
Modelo
Controlador
t
le
ut
O
Vista
Modelo
Targ
et
Controlador
t io
Ac
n
t
le
ut
O
Vista
Modelo
59
En el controlador hay targets que son activados cuando ocurre alguna accin en el
controlador.
Algunas veces la vista quiere saber que hacer cuando ocurren eventos en ella y necesita
indicrselo al controlador:
"Data Source": la vista puede preguntar por el dato al controlador, por ejemplo de una lista
de 2.000 canciones dame las siete primeras
Target
Controlador
n
t
le
t io
ut Ac
O
e
at
e
leg
rc
De sou
ta
Da
Modelo
Vista
60
"hablar" con el
Esto se realiza mediante Broadcast de los objetos del Modelo y suele pasar el puntero al
objeto que ha cambiado.
Target
Controlador
n
t
t io
le
ut Ac
O
e
at
leg
ce
ur
De
so
ta
Da
Notification
& KVO
Vista
Modelo
61
62
Una vista es una instancia de la clase UIView (o una de sus subclases) y gestiona un rea
rectangular en la ventana de aplicacin. Las vistas son responsables de dibujar
contenidos, gestionar eventos multitctiles, y gestionar la distribucin de las subvistas.
Dibujar implica el uso de tecnologas de grficos, tales como Core Graphics, OpenGL ES,
o UIKit para dibujar formas, imgenes y texto dentro de una vista rectangular. Una vista
responde a los eventos producidos por el tacto en su rea rectangular ya sea mediante el
uso de reconocedores de gesto (Gesture recognizers) o por el manejo directo de eventos
de presin. En la jerarqua de vistas, las vistas padres son responsables de posicionar y
dimensionar las vistas hijas y pueden hacerlo de forma dinmica. Esta capacidad de
modificar las vistas hijas dinmicamente permite que a las vistas ajustarse dinmicamente
a las condiciones cambiantes, como las rotaciones del interfaz y las animaciones.
Las ventanas coordinan la visualizacin de sus vistas. Una ventana es una instancia de la
clase UIWindow y se encarga de la representacin general de la interfaz de usuario en la
aplicacin. Las ventanas trabajan con las vistas (y sus controladores de vista propietarios)
para gestionar las interacciones y los cambios en la jerarqua de vistas. En la mayora de
las aplicaciones la ventana principal no suele cambiar. Despus de que la ventana se
cree, se mantiene la misma y cambia slo las vistas mostradas en ella. Cada aplicacin
tiene al menos una ventana que muestra la interfaz de usuario de la aplicacin en la
pantalla principal de un dispositivo.
Las animaciones proporcionan a los usuarios informacin visible sobre cambios en la
jerarqua de vistas. El sistema define por defecto animaciones estndar para la
presentacin de de vistas y la transicin entre los diferentes grupos de vistas.
Sin embargo, muchos de los atributos de una vista tambin se pueden animar
directamente. Por ejemplo, a travs de una animacin se puede cambiar la transparencia
de una vista, su posicin en la pantalla, su tamao, su color de fondo, u otros atributos. Y
si se trabaja directamente con el objeto de la vista la capa subyacente Core Animation,
puede realizar muchas otras animaciones tambin.
Interface Builder es una aplicacin que se utiliza para construir grficamente y configurar
las ventanas de una aplicacin y sus vistas. Usando el Interface Builder, se montan las
vistas y se recogen en un archivo nib, que es un archivo de recursos que almacena las
vista y otros objetos. Cuando se carga un archivo nib en tiempo de ejecucin, los objetos
en su interior se reconstituyen en objetos reales cuyo cdigo se puede manipular
mediante programacin.
Interface Builder simplifica mucho el trabajo que tenemos que hacer en la creacin de
interfaz de usuario de la aplicacin. Debido a que el apoyo a la interfaz de archivos
Builder y plumn se incorpora a travs de iOS, se requiere poco esfuerzo para incorporar
archivos nib en el diseo de la aplicacin.
Las vistas trabajan con Core Animation que proporciona comportamiento grfico y la
animacin a dichas vistas.
Cada vista est respaldada por un objeto capa de la clase CALayer que maneja el su
almacenamiento y las animaciones definidas.La mayora de las operaciones se realizan a
travs de la interfaz de UIView.
Para ayudar a entender la relacin entre vistas y capas de Core Animation nos fijamos en
la figura a continuacin.
Las vistas de la aplicacin incluyen una ventana (que es tambin una vista, un objeto
genrico UIView que actual como una vista contenedor,una vista de una imagen, una
barra de herramientas para controles y un tem botn (que no es una vista en s mismo
pero que maneja una vista internamente). Cada vista tiene un objeto de capa
correspondiente que es accesible a travs de las propiedades de la capa, (como el botn
no es una vista no podemos acceder a la capa a travs de l) Detrs de cada objeto de
capa esta Core Animation representndolos y en ltima instancia el hardware a travs de
cada pixel.
Los objetos de capa de Core Animation permiten que la representacin de grficos en la
pantalla se guarde en cach, de forma que no ocupan tiempo de proceso.
Cambiar el tamao de una vista padre tiene un efecto domin que puede provocar que el
tamao y la posicin de las subvistas que cambien tambin. No obstante configurando a
las subvistas esto se podra evitar.
La disposicin de las vista en una jerarqua de vistas tambin determina cmo responde
la aplicacin a los eventos. Cuando un evento de tacto se produce dentro de una vista
especfica el sistema enva un objeto evento con la informacin de contacto directamente
a la vista para su manejo. Sin embargo, si la vista no se ocupa de ese evento, se puede
pasar el objeto evento a la supervista y si ocurriera lo mismo el objeto evento se
trasladara hacia arriba en la jerarqua de vistas.
Modos de contenidos
Cada vista tiene un modo de contenido que controla como la vista controla la forma
cuando se recicla su contenido en respuesta a cambios en la geometra de la vista o si se
recicla todo su contenido. Cuando una vista se muestra por primera vez, dibuja su
contenido,por defecto y los resultados se recogen en un mapa de bits subyacente.
Despus de eso, los cambios en la geometra de la vista no siempre causan el mapa de
bits que se vuelva a crear. En cambio, el valor de la propiedad contentMode determina si
el mapa de bits se debe ser escalado para ajustarse a los lmites nuevos o simplemente
se fija a una esquina o borde de la vista.
El modo el contenido se aplica en la vista cuando se produce lo siguiente:
Cambio del ancho o el alto del rectngulo de la vista o de os bordes del rectngulo.
65
Vistas extensibles
Se puede designar una parte de una vista como extensible de modo que cuando el
tamao de la vista, slo cambia el contenido en la porcin extensible afectada.
Normalmente, se utilizan zonas extensibles para los botones u otras vistas donde parte de
la vista define un patrn repetible. Por supuesto, cuando se estira una vista a lo largo de
dos ejes, los bordes de la vista tambin se debe definir un patrn repetible para evitar
cualquier distorsin. La figura muestra cmo esta distorsin se manifiesta en una vista. El
color de cada uno de los pxeles originales de la vista se replica para rellenar el rea
correspondiente en la vista ms grande.
Un lugar donde las animaciones son muy importantes es cuando se realizan transiciones
de un conjunto de vista a otro. Normalmente, se utiliza un controlador de vista para
gestionar las animaciones asociadas con cambios significativos entre las partes de la
interfaz de usuario. Por ejemplo, para interfaces que implican la navegacin de nivel
superior al de menor nivel de informacin, normalmente se utiliza un controlador de
navegacin para gestionar las transiciones entre las vistas para cada nivel sucesivo de
datos. Sin embargo, tambin puede crear transiciones entre dos conjuntos de vistas
utilizando animaciones en lugar de un controlador de vista. Es posible hacerlo cuando el
nivel de controlador de vista no producen los resultados deseados.
Adems de las animaciones creadas mediante clases UIKit, tambin se pueden crear
67
animaciones con las capas de Core Animation. Bajando al nivel de capa hay mucho ms
control sobre el momento y las propiedades de las animaciones.
Hay que tener cuidado cuando se realizan animaciones y transiciones para conocer el
sistema de coordenadas en uso, UIWindow y UIView proporcionan mtodos para poder
convertir dichas coordenadas de un sistema a otro.
de la supervista.
Se utiliza el Centre y las propiedades del Frame principalmente para la manipulacin de la
geometra de la vista actual. Por ejemplo, se pueden utilizar estas propiedades al construir
su jerarqua de vistas o cambiar la posicin o el tamao de una vista en tiempo de
ejecucin. Si cambiamos slo la posicin de la vista (y no su tamao), la propiedad del
Centre es la mejor forma de hacerlo.
Se utiliza la propiedad bounds principalmente durante su dibujo. EL Bound del rectngulo
se expresa en el propio sistema local de coordenadas de la vista. El origen
predeterminado de este rectngulo es (0, 0) y su tamao coincide con el tamao del
rectngulo del Frame. Cualquier cosa que se dibuje dentro de este rectngulo es parte del
contenido visible de la vista. Si cambia el origen del Bounds del rectngulo, cualquier cosa
que se dibuje dentro del nuevo rectngulo se convierte en parte del contenido visible de la
vista.
La figura siguiente muestra la relacin entre los rectngulos del Frame y Bounds. En la
figura, la esquina superior izquierda de la imagen de la vista se encuentra en el punto (40,
40) en el sistema de coordenadas de su supervista y el tamao del rectngulo es de 240
por 380 puntos. Para el Bounds, el punto de origen es (0, 0) y el tamao del rectngulo es
similar 240 por 380 puntos.
rectngulo.
Puntos vs Pixel
En iOS, todos los valores de las coordenadas y las distancias se especifican mediante
valores de punto flotante en unidades conocidas como puntos. El tamao mensurable de
un punto vara de un dispositivo a otro y es en gran medida irrelevante. Lo ms importante
a comprender acerca de los puntos es que proporcionan un marco fijo de referencia para
el dibujo.
Dispositivo
Dimensiones en puntos de la
pantalla)
320 x 480
768 x 1024
El sistema de medida basado en puntos es utilizado para cada tipo de dispositivo y define
lo que se conoce como el espacio de coordenadas del usuario. Este es el espacio de
coordenadas estndar que utiliza para casi todo el cdigo. Por ejemplo, se pueden utilizar
los puntos y el espacio de coordenadas del usuario en la manipulacin de la geometra de
una vista o llamando al funciones del Core Graphics para dibujar el contenido de una
70
vista. Aunque las coordenadas del espacio de coordenadas del usuario se asignan
directamente a los pxeles de la pantalla del dispositivo, nunca debe asumir que este es el
caso. En su lugar, siempre debe recordar lo siguiente:
Un punto no corresponde necesariamente a un pxel en la pantalla.
5.
6.
7.
8.
cambiar este modo, segn sea necesario para ajustar su contenido de forma diferente,
pero se debe evitar el uso del modo de contenido UIViewContentModeRedraw si se
puede. Siempre se puede obligar a re dibujar una vista con llamando a setNeedsDisplay
y setNeedsDisplayInRect.
Implementar Vistas opacas siempre que sea posible
UIKit utiliza la propiedad opaca de cada vista para determinar si la vista puede optimizar
las operaciones de composicin. Establecer el valor de esta propiedad a Yes para una
vista personalizada UIKit conocer que no tiene qu dibujar ningn contenido detrs de la
vista. No tener que dibujar tanto dar lugar a un mayor rendimiento para el cdigo de
dibujo. Por supuesto, si se establece la propiedad opaco en YES, la vista debe llenar el
rectngulo completamente con contenido totalmente opaco.
Ajustar el comportamiento de dibujo de la vista para cuando se realice scroll
El desplazamiento puede incurrir en numerosas actualizaciones del dibujo en un corto
perodo de tiempo. Si el cdigo de la vista de dibujo no se ajusta adecuadamente, el
rendimiento de desplazamiento de su punto de vista podra ser lento. En lugar de trate de
asegurar que el contenido de su vista es original en todo momento, puede cambiar el
comportamiento de la vista, cuando una operacin de desplazamiento comienza. Por
ejemplo, se puede reducir la calidad del contenido representado de forma temporal o
cambiar el modo de contenido mientras que un desplazamiento en curso. Cuando el
desplazamiento se detenga, a continuacin, puede volver la vista a su estado anterior y
actualizar los contenidos cuando sea necesario.
73
Interface Builder
Interface Builder puede usarse como editor e interfaz de usuario, aunque tambin hay que
entenderlo como una herramienta de administracin de objetos ms general.
EN XCODE IB (Interface Building) tiene varias funciones:
Los programadores avanzados usan IB para la personalizacin de los objetos, como por
ejemplo sustituir el grfico de un botn estndar por otro ms dibujado.
La creacin de archivos .nib se ve complementada por la creacin de ficheros .nib que se
pueden cargar a peticin de cualquier objetos que los necesite.
La carga manual de nib es similar a la automtica, con la diferencia de que los objetos
definidos pueden cargarse y quitarse desde la memoria cuando sea necesario. Este
mtodo permite ahorra espacio en memoria ya que al pasar de una vista a otra la primera
se elimina de la memoria.
75
Para comenzar a usar IB hay que crear o usar un proyecto de aplicacin basada en IOS
que utilice ventanas.
Una vez creado seleccionamos en archivo .xil. En este caso si llamamos al proyecto
IB_prueba el archivo creado porXcode se llamar IB_pruebaViewController.nib.
Si seleccionamos el archivo en la ventana de trabajo se muestra la siguiente disposicin:
La columna de iconos a la izquierda del rea del editor principal muestra los objetos del
archivo nib.
Un tringulo en la parte inferior de esta columna despliega una lista ms detallada con
descriptores de texto.
El men de navegacin jerrquico encima del rea del editor proporciona acceso rpido a
los objetos en el nib y a otros archivo nib.
En el rea del editor se encuentra los objetos del interfaz rodeada por una linea azul que
permite mover la interfaz de posicin.
Si un objeto carga otro nib (cuando un controlador de vista carga una vista) el editor
muestra un mensaje de marcador de posicin sencillo que indica que ah van los
contenidos de otro nib.
76
El rea de utilidades
Muestra iconos y opciones que permiten configurar el archivo nib.
77
Las opciones Simulated Metrics ofrecen una vista previa de las caractersticas de
navegacin de manera que se pueden disear el resto de la vista con las proporciones
correctas.
Casi todas las opciones que aparecen en ambas listas se pueden modificar por cdigo
pero es ms sencillo obtener una vista del resultado en IB.
Size Inspector configura las dimensiones y la alineacin de un objeto. Tambin controla
el auto dimensionamiento: la capacidad de un objeto de auto dimensionarse al tamao y
posicin de una ventana o vista tras una rotacin o dimensionamiento manual.
78
79
En la opcin type podemos seleccionar id, o la clase del objeto que enva el mensaje, en
este ejemplo UIButton. Es conveniente utilizar el tipo id para manejar mensajes de varios
objetos diferentes o no se necesita leer las propiedades del objeto. A partir de ese
momento se puede aadir cdigo extra que determine la clase que envi el mensaje. Se
utilizar una clase especfica cuando se quiera leer informacin del botn o cambiar
alguna de las propiedades.
La pestaa Event permite cambiar el evento si nos hemos equivocado y queremos
seleccionar otro diferente.La opcin Arguments ofrece las siguientes posibilidades:
81
82
Aadir un Outlet
El manejador que hemos incluido debera tener alguna accin visible asociada. Vamos a
hacer que esa accin cambie el texto de la etiqueta. Para ello necesitamos conectar la
etiqueta a una referencia Outlet de manera que podamos leer y escribir sus propiedades
con cdigo.
Seleccionamos la etiqueta y se mostrar un Connection Inspector que mostrar un
subpanel Referencing Outlet y un subpanel Referencing Outlet Collections. Ignoramos
la opcin Collections y arrastramos la linea desde el crculo junto a New Referencing
Outlet debajo de las llaves, ver figura a continuacin.
Al soltar el botn del ratn aparecer un cuadro de dilogo para indicar el nombre del
Outlet. El Type indica el tipo del objeto, que en este acaso es la etiqueta, y la opcin de
Storage nos permite administrara la gestin de memoria del objeto. Por lo general es
mejor escoger Retain. Pulsamos Connect y ya estar creado el Outlet.
IB aade el outlet en dos lugares, aparecer una propiedad prefijada dentro de las llaves
y, debajo de ellas aparece una declaracin @property separada por una directiva
IBOutlet.
Xcode generar un cdigo en cuatro lugares:
Ha aparecido una nueva directiva @synthesize que sintetiza el acceso a la
propiedad de la etiqueta.
EL objeto de etiqueta se ha incluido el mtodo dealloc , lo que asegura que la
memoria utilizada por la etiqueta del objeto se libera cuando la clase de controlador
libera memoria.
La etiqueta se ha aadido al mtodo viewDidUnload.
Finalmente el mtodo buttonWasTrapped se ha aadido como un stub aparte.
83
Probar la aplicacin
Para probar una aplicacin hay que pulsar la flecha Build & Run en la parte superior
izquierda de la barra de herramientas de Xcode. La aplicacin debera de compilarse y
ejecutarse en la ventana del simulador.
84
Gestin de la pantalla
Ventanas
Todas las aplicaciones iOS necesitan por lo menos una ventana, una instancia de la clase
UIWindow, algunos pueden incluir ms de una ventana. Un objeto ventana tiene varias
responsabilidades:
En iOS, las ventanas no tienen barras de ttulo, botn de salida, o cualquier elemento
visual. Una ventana es siempre un recipiente blanco para una o varias vistas. Adems, las
aplicaciones no cambian su contenido, mostrando nuevas ventanas. Si desea cambiar el
contenido que aparece, cambia la vista del primer plano en su lugar.
La mayora de las aplicaciones de iOS crean y utilizan una ventana durante su ejecucin.
Esta ventana se extiende por la pantalla principal del dispositivo y se carga desde el
archivo nib de la aplicacin principal (o se crea mediante programacin) al comienzo de la
vida de la aplicacin. Sin embargo, si una aplicacin es compatible con el uso de una
pantalla externa para la salida de vdeo, se puede crear una ventana adicional para
mostrar contenido en dicha pantalla externa. Todas las dems ventanas son tpicamente
creadas por el sistema, y se crean generalmente en respuesta a eventos especficos,
tales como una llamada telefnica entrante.
Para muchas aplicaciones la nica vez que interactan con una ventana es al inicio. No
obstante hay otras ocasiones para comunicarse:
85
Vistas
Debido a que los objetos vistas son la forma principal de la aplicacin interacta con el
usuario, tienen muchas responsabilidades. stos son slo algunas:
bounds,
transform
frame,
autoresizingMask,
autoresizesSubviews
Uso
Estas propiedades afectan a la opacidad de la vista. El
alpha y hidden cambian la opacidad de la vista
directamente.
La propiedad opaque indica al sistema cmo debe
compuesta la vista. Establezca esta propiedad en S si
el contenido de su punto de vista es totalmente opaco y
por lo tanto no revela el contenido de la vista
subyacente. Al establecer esta propiedad en YES
mejora el rendimiento mediante la eliminacin de
operaciones innecesarias de composicin.
center, Estas propiedades afectan el tamao y la posicin de
la vista. El center y frame representan la posicin de la
vista con respecto a su vista padre. El frame tambin
incluye el tamao de la vista. La propiedad bounds
define el rea de la vista de contenido visible en su
propio sistema de coordenadas.
La propiedad transform se utiliza para animar o mover
toda la vista de manera compleja. Por ejemplo, se
utiliza una transformacin para rotar o escalar la vista.
Si la transformacin actual no es la transformacin de
la identidad, la propiedad frame est definida y debe
ser ignorada.
Estas propiedades afectan al comportamiento de
cambio de tamao automtico de la vista y sus
subvistas. La propiedad autoresizingMask controla
cmo una visin responde a los cambios en los lmites
de la visin de los padres. La propiedad
autoresizesSubviews controla si la vista cambia de
tamao absoluto.
contentMode,
contentStretch, Estas propiedades afectan al comportamiento de
contentScaleFactor
representacin de los contenidos dentro de la vista. El
contentMode y las propiedades contentStretch
determinan cmo el contenido se trata cuando el ancho
de la vista o la altura cambans. La propiedad
contentScaleFactor slo se utiliza cuando se necesita
para personalizar el comportamiento de la vista de
dibujo para pantallas de alta resolucin.
gestureRecognizers,
userInteractionEnabled,
multipleTouchEnabled,
exclusiveTouch
backgroundColor,
subviews, Estas propiedades y mtodos ayudan a administrar
drawRect:
method,
layer, el contenido real de la vista. Para las vistas
(layerClass method)
simples, se puede establecer un color de fondo y
89
el
o
Para eliminar una vista secundaria del padre, se llama al mtodo removeFromSuperview
de la subvista (no la vista padre).
Cuando se aade una subvista al padre, el actual vista del Frame denota su posicin
inicial dentro de la vista padre. Una subvista cuyo frame se encuentre fuera de los lmites
visibles de su Superview no se recorta de forma predeterminada. Si desea que la subvista
sea recortada a los lmites de la Superview, se debe establecer explcitamente la
propiedad de la supervista clipsToBounds en YES.
El ejemplo ms comn de agregar una vista secundaria a otra vista se produce en la
aplicacin: didFinishLaunchingWithOptions: Mtodo de casi todas las aplicaciones.
El cdigo siguiente muestra una versin de este mtodo que instala en el controlador de
vista de la aplicacin en la ventana. Tanto la ventana y el controlador de vista se
almacenan en el archivo de la aplicacin principal, que se carga antes de que se llame al
mtodo. Sin embargo, la jerarqua de la vista gestionada por el controlador de vista no se
carga realmente hasta que la propiedad accede a la vista.
Aadir una vista a una ventana:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
// Add the view controller's view to the window and display.
[window addSubview:viewController.view];
[window makeKeyAndVisible];
return YES;
}
Aadir vistas a una jerarqua de vistasGestin
(void)viewDidLoad
{
[super viewDidLoad];
self.title = NSLocalizedString(@"TransitionsTitle", @"");
// create the container view which we will use for transition animation (centered
horizontally)
CGRect frame = CGRectMake(round((self.view.bounds.size.width kImageWidth) / 2.0),
kTopPlacement, kImageWidth, kImageHeight);
self.containerView = [[[UIView alloc] initWithFrame:frame] autorelease];
[self.view addSubview:self.containerView];
// The container view can represent the images for accessibility.
[self.containerView setIsAccessibilityElement:YES];
91
[self.containerView setAccessibilityLabel:NSLocalizedString(@"ImagesTitle",
@"")];
// create the initial image view
frame = CGRectMake(0.0, 0.0, kImageWidth, kImageHeight);
self.mainView = [[[UIImageView alloc] initWithFrame:frame] autorelease];
self.mainView.image = [UIImage imageNamed:@"scene1.jpg"];
[self.containerView addSubview:self.mainView];
// create the alternate image view (to transition between)
CGRect imageFrame = CGRectMake(0.0, 0.0, kImageWidth, kImageHeight);
self.flipToView = [[[UIImageView alloc] initWithFrame:imageFrame] autorelease];
self.flipToView.image = [UIImage imageNamed:@"scene2.jpg"];
}
Ocultar vistas
Para ocultar la visin de una vista, se puede establecer su propiedad oculta en YES o
cambiar la propiedad alpha a 0,0. Una vista oculta no recibe eventos de contacto del
sistema. Sin embargo, vistas ocultas no participan en tamao automtico y otras
operaciones de diseo asociados con la jerarqua de vistas. Por lo tanto, ocultando una
vista es a menudo una alternativa conveniente a la eliminacin de vistas en la jerarqua de
vista, especialmente si se va a mostrar la vista de nuevo en algn momento.
Localizacin de una vista en una jerarqua de vistas
Hay dos maneras de localizar vistas en una jerarqua de vistas:
Siempre que el tamao de una vista cambie, el tamao y la posicin de sus subvistas
debe cambiar en consecuencia. La clase UIView admite la disposicin automtica y
manual de las vistas en una jerarqua de vistas. Con la disposicin automtica, se
establecen las reglas que debe seguir cada vista cuando cambia el tamao de su vista
padre. Con diseo manual, se ajustar manualmente el tamao y la posicin de las vistas
cuando sea necesario.
Estar preparado para los cambios de diseo
Los cambios de disposicin pueden ocurrir cuando cualquiera de los siguientes eventos
ocurren en una vista:
Definicin
UIViewAutoresizingNone
UIViewAutoresizingFlexibleHeight
UIViewAutoresizingFlexibleWidth
UIViewAutoresizingFlexibleLeftMargin
UIViewAutoresizingFlexibleRightMargin
La figura siguiente muestra como se aplican las propiedades que hemos visto en la tabla.
Las aplicaciones al recibir un input del usuario ajustan su interfaz en respuesta a dicha
entrada. Una aplicacin puede modificar sus vistas para reorganizar, modificar su tamao
o posicin, ocultando o mostrndolas, o cargando un nuevo conjunto de vistas. En las
aplicaciones de iOS, hay varios lugares y formas en que se realizan estos tipos de
acciones:
En un controlador de vista:
Un controlador de vista tiene que crear sus vistas antes de mostrarlas. Puede
cargar los puntos de vista de un archivo nib o crearlas mediante programacin.
95
Otras formas:
Cada objeto vista tiene una capa dedicada de Core Animation que gestiona la
presentacin y animacin del contenido de la vista en la pantalla. Aunque se puede hacer
muchas cosas con los objetos de la vista, tambin se puede trabajar directamente con los
objetos de la capa correspondiente cuando sea necesario. El objeto capa de la vista se
almacena en la propiedad capa de la vista.
Cambio de la Clase Capa asociada a una vista
96
El tipo de capa asociada a una vista no se puede cambiar despus de que la vista se
crea. Por lo tanto, cada vista se utiliza el mtodo de la clase layerClass para especificar la
clase de su objeto capa. La implementacin predeterminada de este mtodo devuelve la
clase CALayer y la nica manera de cambiar este valor es reemplazar el mtodo y
devolver un valor diferente. Es posible que desee cambiar este valor en los siguientes
casos:
La aplicacin utiliza OpenGL ES para el dibujo, en cuyo caso, la capa debe ser una
instancia de la clase CAEAGLLayer.
Su vista utiliza mosaico para ver una zona desplazable ms grande, en cuyo caso
es posible que desee utilizar la clase CATiledLayer.
2.
3.
4.
5.
98
touchesBegan: withEvent:
touchesMoved: withEvent:
touchesEnded: withEvent:
touchesCancelled: withEvent:
Liberacin de vistas
Si la clase de vista asigna alguna memoria, almacena referencias a objetos
personalizados, o mantienen recursos que deben ser liberados cuando la vista se libera,
se debe implementar el mtodo dealloc. El sistema llama al mtodo dealloc cuando su
contador de vista llega a cero y es el momento de liberarla. La implementacin de este
mtodo debe liberar todos los objetos o recursos en poder de la vista y luego llamar a la
implementacin heredada, como se muestra en el cdigo siguiente.
No se debe usar este mtodo para realizar cualquier otro tipo de tareas.
- (void)dealloc {
// Release a retained UIColor object
[color release];
// Call the inherited implementation
[super dealloc];
}
Animaciones
Las animaciones fluidas proporciona transiciones visuales entre los diferentes estados de
la interfaz de usuario. En iOS, las animaciones se utilizan ampliamente para cambiar la
posicin de las vistas, cambiar su tamao, eliminar las jerarquas de vista, y ocultarlas. Se
pueden usar animaciones para transmitir informacin al usuario o para implementar
interesantes efectos visuales.
En iOS, para la creacin de animaciones sofisticadas, no es necesario escribir ningn
cdigo de dibujo. Para todas las tcnicas de animacin descritas a continuacin se utiliza
el soporte integrado proporcionado por Core Animation. Todo lo que hay que hacer es
activar la animacin y dejar que Core Animation maneje el procesamiento de los
fotogramas individuales. Esto permite que la creacin de animaciones sofisticadas se
muy sencilla, con slo unas pocas lneas de cdigo.
Qu puede animarse?
Tanto UIKit y Core Animation proporcionan apoyo a las animaciones, el nivel de soporte
vara en cada tecnologa. En UIKit, las animaciones se realizan con objetos UIView. Las
vistas soportan un conjunto bsico de animaciones que cubren muchas de las tareas
comunes. Por ejemplo, se puede animar los cambios a las propiedades de las vistas o
usar animaciones de transicin para sustituir a un conjunto de vistas con otras.
La Tabla siguiente enumera las propiedades animables que incorporan la animacin de
apoyo de la clase UIView. Ser animable no significa que las animaciones sucedan
automticamente. Cambiar el valor de los propiedades de una vista normalmente slo
actualiza la propiedad (y la vista) inmediatamente sin una animacin. Para ejecutar una
animacin, debe cambiar el valor de la propiedad desde el interior de un bloque de
101
animacin.
Propiedad
frame
bounds
centre
transform
alpha
para
cambiar
gradualmente
la
Las transiciones animadas de vistas son una manera de hacer cambios en la jerarqua de
vistas ms all de las ofrecidas por los controladores de vista. Aunque se deben utilizar
controladores de vista para administrar jerarquas de vistas, puede haber ocasiones en las
que desea reemplazar todo o parte de una jerarqua de vistas. En esos casos, puede
utilizar la vista a base de transiciones para animar la adicin y eliminacin de vistas.
102
animateWithDuration:animations:
animateWithDuration:animations:completion:
animateWithDuration:delay:options:animations:completion:
Debido a que son mtodos de clase, los bloques de animacin creados no estn
vinculados a una nica vista. Por lo tanto, se pueden utilizar estos mtodos para crear una
animacin simple que involucra cambios en mltiples vistas. Por ejemplo, el cdigo
siguiente muestra el cdigo necesario para una animacin con desvanecimiento en una
sola vista, y otro desvanecimiento durante un perodo de tiempo de un segundo. Cuando
se ejecuta este cdigo, las animaciones especficas se inician inmediatamente en otro
hilo, para evitar bloquear el subproceso actual o el hilo principal de la aplicacin.
[UIView animateWithDuration:1.0 animations:^{
firstView.alpha = 0.0;
secondView.alpha = 1.0;
}];
El cdigo siguiente muestra un ejemplo de un bloque de animacin que utiliza un
controlador de finalizacin para iniciar una nueva animacin despus de que uno de los
primeros haya acabado. La primera llamada a
animateWithDuration:delay:options:animations:completion:
crea una animacin fade-out y lo configura con algunas opciones de personalizacin.
Cuando la animacin se ha completado, su controlador de finalizacin ejecuta y configura
la segunda mitad de la animacin, que se desvanece de la vista de nuevo despus de un
retraso.
El uso de un controlador de finalizacin es la principal forma en que se vincula varias
animaciones.
- (IBAction)showHideView:(id)sender
{
// Fade out the view right away
[UIView animateWithDuration:1.0
delay: 0.0
options: UIViewAnimationOptionCurveEaseIn
animations:^{
thirdView.alpha = 0.0;
}
completion:^(BOOL finished){
// Wait one second and then fade in the view
[UIView animateWithDuration:1.0
delay: 1.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
thirdView.alpha = 1.0;
}
completion:nil];
}];
103
}
Si se realizan animaciones con IOS 3.2 o anterior se debera usar el mtodo
Begin/Commit.
Animaciones en las transiciones entre vistas
Transiciones entre vistas ayudan a ocultar los cambios bruscos asociados a la inclusin,
supresin, ocultacin, o mostrar vistas en la jerarqua de vistas. Utilizar transiciones de
vista para implementar los siguientes tipos de cambios:
Cambiar las subvistas visibles de una vista existente. Por lo general, seleccione
esta opcin si se desean realizar cambios relativamente pequeos a una vista
existente.
Reemplazar una vista con otra en nuestra jerarqua de vistas con una perspectiva
diferente. Por lo general, seleccione esta opcin si se desea reemplazar una
jerarqua de vistas que abarcan la totalidad o la mayor parte de la pantalla.
105
Eventos
Acerca de los eventos en iOS
Los usuarios manipulan sus dispositivos iOS de muchas maneras, tocando la pantalla o
agitando el dispositivo. iOS interpreta cundo y cmo el usuario manipula el hardware y
pasa esta informacin a la aplicacin. Si la aplicacin responde a las acciones en forma
natural e intuitiva, la experiencia para el usuario ser muy satisfactoria.
UIKit hace ms fcil para la aplicacin la deteccin de gestos
Las aplicaciones iOS reconocen combinaciones de toques y responden a ellas de manera
que sean intuitivas para los usuarios, como hacer zoom sobre el contenido en respuesta a
un gesto de pellizco y el desplazamiento por el contenido en respuesta a un gesto de
arrastrar. De hecho, algunos gestos son tan comunes que estn integradas en UIKit.
Por ejemplo, las subclases uicontrol, tales como UIButton y UISlider, responden a gestos
especficos un toque en un botn y un arrastre para ua barra de desplazamiento. Al
configurar estos controles, se enva un mensaje de accin a un objeto de destino cuando
ese contacto se produce. Tambin puede utilizar el mecanismo Target-Action en vistas
utilizando reconocedores gesto. Cuando se conecta un reconocedor de movimientos a
una vista, toda la vista acta como un control de la respuesta a cualquier gesto que
especifique.
Reconocedores de gestos proporcionan una abstraccin de alto nivel a la lgica compleja
de la gestin de eventos. Reconocedores de gestos son la mejor forma de poner en
prctica el control de eventos tctil en la aplicacin porque los reconocedores gesto son
muy potentes, reutilizables y adaptables. Se puede utilizar uno de los reconocedores de
gesto integrados y personalizar su comportamiento. O se puede crear su propio
reconocedor de movimientos para reconocer un nuevo gesto.
106
Reconocedores de gestos
Son objetos que se conectan a una vista y que permiten que las vitas respondan a las
acciones de la manera que el control se haya definido. Los reconocedores de gestos
interpretan los toques para determinar si corresponden a un gesto especfico, como un
golpe, un pellizco o una rotacin. Si reconocen el gesto asignado, se enva un mensaje de
accin a un objeto de destino. El objeto de destino es tpicamente controlador de la vista,
que responde al gesto como se muestra en la Figura siguiente. Este patrn de diseo es a
la vez potente y simple, se pueden determinar dinmicamente las acciones a las que una
vista responde, se pueden aadir reconocedores gesto a una vista sin tener que hacer
una subclase de la vista.
107
Clase de UIKit
UITapGestureRecognizer
UIPinchGestureRecognizer
UIPanGestureRecognizer
UISwipeGestureRecognizer
UIRotationGestureRecognizer
UILongPressGestureRecognizer
108
110
111
El objetivo final de estos caminos de eventos es encontrar un objeto que pueda controlar y
responder a un evento. Por lo tanto, UIKit primero enva el evento al objeto que es el ms
adecuado para controlar el evento. Para los eventos de toque, ese objeto es la vista hittest, y para otros eventos, ese objeto es elFirst Responder.
Los eventos no son los nicos objetos que se basan en la cadena de respuesta. La
cadena de respuesta se utiliza en todos los siguientes:
edicin, iOS utiliza una cadena de respuesta para encontrar un objeto que
implementa los mtodos necesarios (tales como corte:, copia: y :) pasta. Para
obtener ms informacin, consulte "Visualizacin y Administracin del men Edit" y
el proyecto de cdigo de ejemplo, CopyPasteTile.
Test editing. Cuando un usuario toca un campo de texto o una vista de texto, esa
visin se convierte automticamente en el primer nivel de respuesta. Por defecto, el
teclado virtual y el campo de texto o en la vista texto se convierte en el foco de
edicin. Puede mostrar una vista de entrada personalizado en lugar del teclado si
es apropiado para su aplicacin. Tambin puedes aadir una vista de entrada
personalizado a cualquier objeto que responde. Para obtener ms informacin,
consulte "Vistas personalizadas para la entrada de datos".
UIKit ajusta automticamente el campo de texto o en la vista de texto que un usuario toca
ser el primero en responder; apps debe establecer explcitamente todos los dems
objetos primer nivel de respuesta con el mtodo becomeFirstResponder.
Eventos de movimiento
Los usuarios generan eventos de movimiento cuando se mueven, agitar o inclinan el
dispositivo. Estos eventos de movimiento son detectados por el hardware del dispositivo,
especficamente, el acelermetro y el giroscopio.
El acelermetro se compone realmente de tres acelermetros, uno para cada eje-x, y, y z.
Cada uno mide los cambios en la velocidad en el tiempo a lo largo de una trayectoria
lineal. La combinacin de los tres acelermetros permite detectar el movimiento del
dispositivo en cualquier direccin y obtener orientacin actual del dispositivo. Aunque hay
tres acelermetros, el resto de este documento se refiere a ellos como una sola entidad.
El giroscopio mide la tasa de rotacin alrededor de los tres ejes.
Todos los eventos de movimiento se originan por el mismo hardware. Hay varias maneras
diferentes que se pueda acceder a los datos de hardware, dependiendo de las
necesidades de la aplicacin:
115
Para hacer que sea capaz de convertirse en el First Responder, la vista o el controlador
vista controlador debe reemplazar el mtodo de la clase canBecomeFirstResponder
UIResponder para retornar S. Tambin se debera enviar el mtodo
becomeFirstResponder en un momento apropiado. Por ejemplo, un controlador de vista
podra utilizar el mtodo becomeFirstResponder en un mtodo viewDidAppear, como en
el listado siguiente. Este ejemplo tambin muestra como enciende el controlador de vista
la entrega de eventos de control remoto mediante una llamada al mtodo
beginReceivingRemoteControlEvents de UIApplication.
116
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// Turn on remote control event delivery
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
// Set itself as the first responder
[self becomeFirstResponder];
}
117
Persistencia de datos
Introduccin
Cuando en una aplicacin de iOS necesitemos almacenar informacin que se conserve
entre una y otra ejecucin de nuestra aplicacin, tendremos ante nosotros las siguientes
opciones:
NSUserDefaults: podemos almacenar simples preferencias de usuario utilizando tipos de
datos como NSString o NSInteger.
Ficheros .plist: son ficheros de tipo XML donde poder almacenar medianas cantidades
de informacin. Esta informacin podra ser objectos serializados y por tanto es una
opcin muy a tener en cuenta en cuando a sencillez y posibilidades.
SQL Lite: es un motor de base de datos que ofrece nuestro dispositivo y sobre el cual
podemos construir modelos completos de datos.
Core Data: es un framework que nos facilita Apple, y que por debajo realmente utiliza
SQL Lite, pero contamos con una serie de herramientas que nos facilita tanto la creacin
del modelo como su gestin posterior desde cdigo. Esta es la opcin que vamos a
abordar en este artculo.
Core Data es una tecnologa para la gestin del modelo de datos de una aplicacin de
Modelo-Vista-Controlador. Est diseado para uso en aplicaciones en las que ya est el
modelo de datos altamente estructurado. Fundamentalmente, Core Data ayuda a guardar
los objetos del modelo (en el sentido del patrn de diseo modelo-vista-controlador) a un
archivo y leer del mismo otra vez. Esto es similar a la gestin de archivos (ver Gua de
Archivos y serializaciones de programacin), pero no los Core ofrece mucho ms que eso.
Entre otras cosas, estas:
Proporciona una infraestructura para la gestin de todos los cambios en los objetos
modelo. Esto da soporte automtico para deshacer y rehacer, y para el
mantenimiento de las relaciones recprocas entre los objetos.
Permite tener slo un subconjunto de los objetos del modelo en memoria en un
momento dado. Esto es especialmente importante en la conservacin de la
memoria iOS donde es crtica.
Utiliza un esquema para describir el objeto del modelo. Se definen las principales
caractersticas de la clase del modelo, incluyendo las relaciones entre ellos en un
editor basado en GUI. Esto proporciona una gran cantidad de funcionalidades
bsicas "de forma gratuita", incluyendo la fijacin de valores predeterminados.
Permite mantener conjuntos disjuntos de las ediciones de los objetos. Esto es til si
se desea, por ejemplo, permitir al usuario hacer cambios en una vista que se puede
desechar sin afectar a los datos que se muestran en otra vista.
Cuenta con una infraestructura de control de versiones del almacn de datos y la
migracin. Esto permite fcilmente actualizar una versin antigua del archivo del
usuario para la versin actual.
118
Si creamos un nuevo proyecto y activamos el check Utilizar Core Data para persistencia,
veremos que en la carpeta Resources de nuestro proyecto hay un fichero con extensin
.xcdatamodel. Este fichero es el encargado de almacenar cul es la estructura de nuestro
modelo de datos.
Para ello, XCode nos ofrece una herramienta visual de modelado de datos donde poder
crear tablas, campos y relaciones entre los mismos.
Los conceptos bsicos del modelo de datos Code Data
Los patrones de diseo y tcnicas fundamentales que son la base de Core Data
Los aspectos bsicos del uso de la herramienta de modelado de datos Xcode
Cmo crear, actualizar y eliminar objetos gestionados por datos bsicos y la forma
de confirmar los cambios en un almacn de datos
119
120
La Figura siguiente ilustra un contexto del objeto administrado que contiene dos objetos
administrados que corresponden a dos registros en una base de datos externa. En uno de
los objetos, un valor de la propiedad se ha cambiado en la memoria, pero el cambio no se
ha comprometido con la base de datos. Tenga en cuenta que hay dos registros
adicionales en la base de datos para los cuales no existen objetos correspondientes
administrados.
122
Objective-C utilizada para representar las instancias de la entidad. Core de datos utiliza la
descripcin de la entidad para averiguar sobre los objetos de datos que gestiona, por lo
que el nombre de la clase no tiene que ser el mismo que el nombre de la entidad. De
hecho, en algunos casos varias entidades pueden ser representados por la misma claseNSManagedObject. Core Data es capaz de diferenciar los casos sobre la base de su
descripcin de la entidad asociada.
Agregar los atributos
En primer lugar, agregar el atributo de la fecha de creacin.
>> Asegurarse de que ha seleccionado en el panel Evento entidad, a continuacin,
seleccione Disear> Modelo de Datos> Aadir atributo.
Se debe ver a un nuevo atributo (llamado NewAttribute) aparecen en el panel de
propiedades. Es necesario configurar el nombre y el tipo.
>> Asegrese de que ha seleccionado el nuevo atributo en el panel de propiedades, a
continuacin, en el panel de detalles cambia el nombre del atributo que creationDate, y
seleccione Fecha en el tipo de men emergente.
No es necesario configurar cualquiera de los otros valores.
Ahora Se agregan los atributos de latitud y longitud.
>> Asegurarse de que ha seleccionado en el navegador de eventos entidad, a
continuacin, seleccione Disear> Modelo de Datos> Aadir atributo dos veces (para
sumar dos atributos).
>> Seleccionar los atributos nuevos en el panel de propiedades, a continuacin, en el
panel de detalles, seleccione el tipo de doble men emergente.
>> Seleccionar slo el primer atributo nuevo en el panel de propiedades y, en el panel de
detalles cambia el nombre del atributo de la latitud.
>> Seleccionar slo el segundo atributo nuevo en el panel de propiedades y, en el panel
de detalles cambia el nombre del atributo a la longitud.
La pantalla debe ser similar a esto:
124
Ahora usemos Xcode para generar los archivos para una clase personalizada para
representar a la entidad evento.
>> En Xcode, en el modelo, seleccionar la entidad de sucesos. (Debe seleccionar la
entidad, la seleccin se utilizan para indicar los elementos que desea para crear
subclases.)
>> Seleccione Archivo> Nuevo archivo. En el cuadro de dilogo Nuevo archivo,
seleccione Clase Managed Object.
Dependiendo de la versin de Xcode que est utilizando, la clase de objeto gestionado
puede estar disponible en la seccin de iOS en las clases Cocoa Touch, o puede que
tenga que elegir la plantilla en la seccin de Mac OS X, en Cocoa, ya sea funcionar
correctamente.
Haga clic en Siguiente >>. La ubicacin correcta y objetivos debera estar seleccionas por
Xcode. Hacer clic en Siguiente para aceptar.
Se deber ver el panel de seleccin de la entidad, con la entidad del evento seleccionado.
La "Generacin de acceso" y "Generar Objective-C 2.0" propiedades de opciones tambin
deben estar seleccionadas.
>> Haga clic en Finalizar para generar los archivos.
La interfaz de la clase de eventos y archivos de implementacin se crea y se agrega al
proyecto. Hay un par de cosas para anotar:
En el archivo de interfaz (Event.h), todos los atributos se representan por los
valores de objeto.
A pesar de que ha especificado la latitud y la longitud tipos de atributos como doble,
los valores de las propiedades en tiempo de ejecucin son instancias de
NSNumber. Datos Bsicos utiliza objetos para representar los valores.
En el archivo de aplicacin (Event.m), las propiedades se implementan como
dinmica.
Normalmente se puede esperar para ver sintetizada, sin embargo los datos bsicos
genera los mtodos de acceso en tiempo de ejecucin.
En el archivo de aplicacin (Event.m), no hay ningn mtodo dealloc.
Normalmente, usted puede esperar ver un mtodo para liberar dealloc variables de
instancia, sin embargo Datos Bsicos es responsable de la ciclo de vida de todas
las propiedades de modelado de un objeto administrado. (Si usted aada sus
125
Aadiendo Eventos
El objetivo de este punto es crear la lgica de la aplicacin para permitir al usuario pueda
crear objetos de evento nuevos y los muestre en la interfaz de usuario.
Implementar el Mtodo addEvent
Para crear nuevos objetos de eventos en el mtodo addEvent. Recordemos que se invoca
cuando el usuario pulsa el botn Agregar (vea "viewDidLoad de aplicacin"). Hay varias
partes en el mtodo. Tiene que:
(Void) addEvent;
Obtener la ubicacin actual
Cuando se crea un nuevo objeto de evento, debe configurar su ubicacin. Usted obtiene
la ubicacin del gestor de ubicacin. Si no es capaz de proporcionar una ubicacin,
entonces no contine.
>> Aadir lo siguiente al archivo de implementacin RootViewController:
- (void)addEvent {
CLLocation *location = [locationManager location];
126
if (!location) {
return;
}
}
Crear y configurar el objeto evento
Por
lo
general,
crear
un
objeto
administrado
mediante
el
mtodoinsertNewObjectForEntityForName: inManagedObjectContext: de NSEntityDescription,
devuelve una instancia inicializada correctamente de la clase correcta de la entidad que
se especifique, insertada en el contexto del objeto administrado. Despus de crear el
objeto, se pueden establecer sus valores de propiedad.
Se obtiene la latitud y longitud del lugar como valores escalares, por lo que necesita para
convertir estos objetos NSNumber para el objeto de evento. Se puede obtener la marca
de tiempo de la ubicacin tambin, pero este es un valor constante en el simulador. En
cambio, aqu se puede utilizar el mtodo de la fecha de NSDate para obtener un objeto
fecha que representa la fecha y hora actuales.
// Create and configure a new instance of the Event entity.
Event *event = (Event *)[NSEntityDescription
insertNewObjectForEntityForName:@"Event"
inManagedObjectContext:managedObjectContext];
CLLocationCoordinate2D coordinate = [location coordinate];
[event setLatitude:[NSNumber numberWithDouble:coordinate.latitude]];
[event setLongitude:[NSNumber numberWithDouble:coordinate.longitude]];
[event setCreationDate:[NSDate date]];
Esto ilustra la tcnica general que se utiliza para actualizar un objeto administrado, ya sea
un nuevo objeto gestionado que se ha creado, o uno que viene del almacn. Slo se
tienen que utilizar estos mtodos de acceso, al igual que lo hara con cualquier objeto
Cocoa. Es importante destacar, sin embargo, los cambios no son llevados al almacn
persistente hasta que guarde explcitamente el contexto.
Captacin de Eventos
Para recuperar objetos de un almacn persistente, se necesita un contexto del objeto
gestionado y una peticin de recuperacin. Una peticin de recuperacin es una instancia
de NSFetchRequest. Como mnimo, se especifica la entidad que se est interesado .
Tambin se pueden especificar las restricciones sobre los valores que los objetos deben
tener y qu orden desea que una copia. Por ejemplo, en una aplicacin de informacin de
la empresa, puede crear un peticin de recuperacin para recuperar los objetos
empleados, ordenados por nombre, cuyo salario es mayor que una cierta cantidad. Las
limitaciones se representan mediante un predicado (una instancia de NSPredicate). El
orden es un gnero representado por una array de objetos NSSortOrdering.
A menos que realmente se necesiten todos los objetos de una determinada entidad, se
debe utilizar un predicado para limitar el nmero de objetos devueltos a aquellos que en
realidad ests interesado (Si se va a mostrar objetos en una vista de tabla, tambin puede
utilizar una controlador de recuperacin de resultados NSFetchedResultsController para
127
gestionar un conjunto de resultados. ste intentar asegurar que los datos se mantengan
en la memoria el mayor tiempo posible.)
Hay que tener en cuenta que no siempre se necesita para ejecutar un recuperador para
recuperar los objetos. Core Data, si es necesario, recupera automticamente los objetos
que estn en el destino de una relacin. Por ejemplo, si se ejecuta un recuperador para
recuperar un objeto Empleado, entonces se le pide su Departamento relacionado,
entonces Core Data obtiene el Departamento para usted si no hubiera sido solicitado
antes.
Flujo de recuperacin de datos:
128
El mtodo de
inters aqu
es entityForName NSEntityDescription
de:
inManagedObjectContext:. Se proporciona el nombre de la entidad que se desea y el
contexto del objeto gestionado que est tratando, el mtodo luego pide (objeto
administrado) al modelo de contexto (objeto gestionado) coordinador (almacn
persistente) y recupera a partir de que la entidad con el nombre especificado..
Conceptualmente no es muy difcil (que acaba de navegar por la pila), y se podra hacer
con bastante facilidad, pero es mucho ms conveniente utilizar el mtodo de clase.
Establecer el descriptor de Orden
Si no se especifica un descriptor de clase, el orden en que los objetos son devueltos
desde una recuperacin es indefinido. Para recuperar los eventos en orden cronolgico,
por lo tanto, debe especificar un descriptor de clasificacin para la obtencin de
informacin. Debido a que es posible que desee especificar mltiples ordenamientos de
clasificacin (por ejemplo, es posible que desee ordenar los empleados por departamento,
el apellido y nombre de pila), es necesario poner el descriptor de tipo Array.
>> Al final de la implementacin actual de viewDidLoad, se crea un descriptor de
clasificacin para ordenar los objetos de eventos por fecha de creacin (los ms recientes
primero) y un Array mutable. Aadir el descriptor de clase a la matriz, y establecer el Array
como el Array de solicitud de recuperacin sortDescriptors:
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"creationDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
(A menudo es til usar los initWithObjects: Mtodo de NSArray en caso de que desee
aadir ms descriptores de clasificacin ms adelante.)
Ejecutar el evento
Despus de haber creado una peticin de recuperacin, ahora lo ejecuta. El Array de
eventos tiene que ser mutable, as hay que hacer una copia mutable del resultado.
>> Se agrega el cdigo siguiente al final de la actual aplicacin de viewDidLoad:
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext
executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
}
Terminar
>> Se agrega el cdigo siguiente al final de la actual aplicacin de viewDidLoad:
129
[self setEventsArray:mutableFetchResults];
[mutableFetchResults release];
[request release];
Borrado de Eventos
El objetivo de este punto es permitir al usuario borrar eventos de la lista.
Eliminacin de objetos gestionados
Como se vio al crear un nuevo objeto administrado, el tiempo de vida de un registro en la
base de datos no est vinculado a la duracin de un determinado objeto administrado. Si
se crea un objeto administrado, esto no significa automticamente que se cree para ese
objeto en la base de datos un registro, es necesario debe guardar el contexto para ello.
De manera similar, simplemente porque un objeto se des-asigne no significa que el
registro correspondiente en s se destruya.
Para eliminar un registro, se indica al contexto del objeto gestionado que marque un
objeto como eliminado utilizando el mtodo deleteObject: de NSManagedObjectContext.
Despus para destruir realmente el registro, escriba la accin siguiente y utilice save:.
Eliminacin de un evento
Para hacer frente a la eliminacin, se implementa la vista de la tabla de origen de datos
tableView mtodo: commitEditingStyle: forRowAtIndexPath:. Se necesita hacer tres cosas:
Eliminar el objeto seleccionado.
Actualizacin de la vista de tabla.
Guarde los cambios.
Debe hacer esto slo si la accin es una eliminacin.
>> En el archivo de implementacin RootViewController, aplicar el tableView:
commitEditingStyle: forRowAtIndexPath: mtodo de la siguiente manera:
- (void)tableView:(UITableView *)tableView commitEditingStyle:
(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath
*)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// Delete the managed object at the given index path.
NSManagedObject *eventToDelete = [eventsArray
objectAtIndex:indexPath.row];
[managedObjectContext deleteObject:eventToDelete];
// Update the array and table view.
[eventsArray removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:YES];
// Commit the change.
130
131
Preferencias de usuario
Acerca de las preferencias y ajustes
Las preferencias son piezas de informacin que se almacenan continuamente y se utilizan
para configurar la aplicacin. Las aplicaciones a menudo exponen las preferencias de los
usuarios para que puedan personalizar la apariencia y el comportamiento de la aplicacin.
La mayora de las preferencias se almacenan localmente utilizando las preferencias de
Cocoa Preferences Systems conocido como el sistema de usuario por defecto. Las
aplicaciones tambin puede almacenar las preferencias en iCloud en la cuenta de un
usuario utilizando el Key-value Store.
El sistema de usuario por defecto y Key-value Store estn diseados para el
almacenamiento de datos simples tipo cadenas, nmeros, fechas, valores booleanos,
URLs, objetos de datos, y as sucesivamente, en una lista de propiedades. El uso de una
lista de propiedades tambin significa que se pueden organizar los datos de preferencia
utilizando un Array de tipo diccionario. Tambin es posible almacenar otros objetos en una
lista de propiedades codificadas en un objeto NSData.
Al definir las preferencias de la aplicacin, es mejor utilizar los valores simples y tipos de
datos cuando sea posible. El sistema de preferencias est construido en base a la
propiedades de una lista, tales como cadenas, nmeros y fechas. Aunque se puede
utilizar un objeto NSData para almacenar objetos arbitrarios en las preferencias, no se
recomienda su uso en la mayora de los casos.
El almacenamiento persistente de objetos significa que la aplicacin tiene que decodificar
ese objeto en algn momento. En el caso de las preferencias, un objeto almacenado
significa decodificar el objeto cada vez que acceda a la preferencia. Tambin significa que
una nueva versin de la aplicacin tiene que asegurarse de que es capaz de decodificar
los objetos creados y escritos en el disco usando una versin anterior de la aplicacin, lo
que es potencialmente propenso a dar errores.
Un mejor enfoque de las preferencias es almacenar cadenas simples y valores para crear
los objetos necesarios para las aplicaciones. Almacenar valores simples significa que la
aplicacin siempre se puede acceder al valor. Lo nico que cambia de una versin a otra
132
es la interpretacin del valor simple y los objetos de la aplicacin crea como respuesta.
Proporcionar una interfaz de Preferencia
Para enfrentarnos a las preferencias, la Tabla siguiente lista las opciones a mostrar en las
preferencias del usuario. Como se puede ver en esta tabla, la mayora de las opciones
implican la creacin de una interfaz de usuario personalizada para la gestin y la
presentacin de las preferencias. Si se va a crear una aplicacin para iOS, se puede
utilizar un Setting Bundle para presentar las preferencias, pero hay que hacerlo slo si la
configuracin el usuario cambia con poca frecuencia.
Preference
Frequently changed preferences
Infrequently changed preferences
iOS
Custom UI
Settings bundle
OS X
Custom UI
Custom UI
Las preferencias en las aplicaciones de Mac son accesibles desde un elemento de men
Preferencias en el men de aplicaciones. En aplicaciones Cocoa creadas usando las
plantillas de Xcode, ste proporciona un elemento de men de forma automtica. Es
responsabilidad del programador presentar una interfaz de usuario correspondiente
cuando el usuario elige esta opcin del men. Se puede establecer la interfaz de usuario
mediante la definicin de un mtodo de accin en la aplicacin Delegate que muestra
una ventana de preferencias personalizadas y conectar ese mtodo de accin para el
elemento de men en Interface Builder.
No hay una forma estndar para mostrar preferencias personalizadas desde dentro de
una aplicacin para iOS. Se puede integrar las preferencias de muchas maneras,
incluyendo el uso de una ficha independiente en una interfaz de ficha o usando un botn
personalizado en una de las pantallas de su aplicacin. Las preferencias generalmente se
presentan utilizando un controlador de vista distinto de modo que los cambios en las
preferencias se pueden grabar cuando el controlador de esa vista es cerrado por el
usuario.
La Organizacin de las Preferencias
Preferencias estn agrupadas en dominios, cada uno de los cuales tiene un nombre y un
uso especfico. Por ejemplo, hay un dominio especfico de las preferencias especficos de
la aplicacin y otro para las preferencias de todo el sistema que se aplican a todas las
aplicaciones. Todas las preferencias se almacenan y se accede en funcin de cada
usuario. No hay soporte para el intercambio de preferencias entre los usuarios.
Cada preferencia tiene tres componentes:
La vida til de una preferencia depende del dominio en el que se guarde. Algunos
dominios almacenan las preferencias de manera persistente escribindolas en la base de
datos del usuario por defecto. Tales preferencias siguen existiendo desde el lanzamiento
de aplicacin hasta la siguiente. Otros dominios almacenan las preferencias de una
manera ms voltil, preservando los valores de preferencia slo para la vida del
correspondiente objeto de valores de usuario predeterminados.
Para realizar bsquedas para el valor de una preferencia dada se procede a revisar
dominios en la lista de bsqueda de un objeto de NSUserDefaults. Solo los dominios en la
lista de bsqueda se buscan, y se buscan en el orden que se muestra en la Tabla
siguiente, comenzando con el dominio NSArgumentDomain. La bsqueda termina cuando
una preferencia con el nombre especificado se encuentra. Si varios dominios contienen la
misma preferencia, el valor se obtiene del dominio ms cercano al principio de la lista de
bsqueda.
Dominio
NSArgumentDomain
Application (Identified by the apps identifier)
NSGlobalDomain
Languages (Identified by the language names)
NSRegistrationDomain
Estado
volatile
persistent
persistent
volatile
volatile
Debido a que este dominio es de la aplicacin especfica, los contenidos del dominio
estn vinculados al identificador de paquete de su aplicacin. Los contenidos de este
dominio se almacenan en un archivo que est gestionado por el sistema. En la actualidad,
este archivo se encuentra en el directorio $ HOME / Library / Preferences /, donde $
HOME es el directorio inicial sea la aplicacin o el directorio home del usuario
(dependiendo de la plataforma y de si su aplicacin est en una sandbox). El nombre del
archivo de base de datos de usuario por defecto es <ApplicationBundleIdentifer>.Plist,
donde <ApplicationBundleIdentifer> es el identificador del paquete de la aplicacin. No se
debe modificar el archivo directamente, pero se puede inspeccionar durante la depuracin
para asegurarse de que los valores de preferencia se escriben por la aplicacin.
El dominio global
El dominio global contiene preferencias que son aplicables a todas las aplicaciones y se
identifican por la constante NSGlobalDomain. Este dominio es utilizado habitualmente por
los frameworks del sistema para almacenar todo el sistema de valores y no debe ser
utilizado por su aplicacin para almacenar valores especficos. Si se desea cambiar el
valor de una preferencia en el dominio global, se escribe el valor de esa preferencia en el
dominio de la aplicacin.
El dominio de registro
El registro del dominio define el conjunto de valores por defecto para usar si la preferencia
dada no se establece explcitamente en uno de los otros dominios. En el momento del
lanzamiento, una aplicacin puede llamar a los mtodos de registerDefaults:
NSUserDefaults para especificar un conjunto predeterminado de valores para las
preferencias importantes. Cuando una aplicacin se inicia por primera vez, la mayora de
las preferencias no tienen valores, por lo que la recuperacin de ellos producira
resultados no definidos. El registro de un conjunto de valores predeterminados asegura de
que su aplicacin siempre tiene un conjunto bien conocido de los valores a operar.
El contenido del registro de dominio slo se puede establecer mediante el uso del mtodo
registerDefaults:.
Visualizar las preferencias utilizando la herramienta por defecto
135
Las aplicaciones de Mac que utilizan enlaces Cocoa puede utilizar el objeto
NSUserDefaultsController para establecer y obtener las preferencias de forma automtica.
Por lo general, aadir un objeto as en el fichero nib se utiliza para mostrar las
preferencias de visualizacin del usuario. Se enlazan los controles de interfaz de usuario
a los elementos del controlador de usuario por defecto, que se encarga del proceso de
obtener y establecer valores en la base de datos de usuario por defecto.
Los valores de preferencia debe ser uno de los tipos de los tipos de las propiedades
estndar del objeto de lista: NSData, NSString, NSNumber, NSDate, NSArray o
NSDictionary. La clase NSUserDefaults tambin ofrece funciones para almacenar objetos
NSURL como valores preferentes.
137
Descripcin
La aplicacin no se ha lanzado o ha sido finalizada por el
sistema.
La aplicacin se ejecuta en segundo plano, pero no est
138
Active
Background
Suspended
Cuando se produce una condicin de memoria, el sistema
puede liberarse de aplicaciones suspendidas sin previo
aviso para hacer ms espacio en memoria para la
aplicacin activa.
La Figura siguiente muestra los caminos que toma una aplicacin cuando pasa de un
estado a otro
140
La Figura siguiente muestra la secuencia de eventos que ocurren cuando una aplicacin
se ejecuta hacia el primer plano, incluyendo los mtodos de aplicaciones delegados que
se llaman.
141
application:willFinishLaunchingWithOptions:
application:didFinishLaunchingWithOptions:
144
146
147
Preprese
para
realizar
la
foto.
Cuando
el
mtodo
el
applicationDidEnterBackground: retorna, el sistema toma una fotografa de la
interfaz de usuario de la aplicacin y utiliza la imagen resultante para las
animaciones de transicin. Si las vistas de la interfaz de usuario contienen
informacin confidencial, se debe ocultar o modificarla vista antes de la ejecucin
del mtodo applicationDidEnterBackground:.
Guardar los datos de usuario y la informacin del estado de la aplicacin.
Todos los cambios no guardados se deben escribir en el disco al entrar en el
background. Este paso es necesario porque la aplicacin podra ser liberada
mientras est en el background. Puede realizar esta operacin desde un
subproceso de fondo segn sea necesario.
Liberar tanta memoria como sea posible. Para obtener ms informacin acerca
de qu hacer y por qu esto es importante, consulte "Uso de la memoria para
aplicaciones de fondo."
148
149
150
Las aplicaciones que implementan estos servicios deben declarar los servicios en los que
se apoyan y utilizar los frameworks del sistema para aplicar los aspectos pertinentes de
esos servicios. La declaracin de los servicios permite al sistema saber qu servicios
utiliza, pero en algunos casos se trata de los frameworks del sistema que realmente
impiden la aplicacin de la suspensin.
Concurrencia y threads secundarios
El sistema crea el hilo principal de la aplicacin, pero la aplicacin puede crear sub
procesos adicionales, segn sea necesario para llevar a cabo otras tareas. La mejor
forma de crear hilos es dejar que el sistema lo haga por usted mediante el uso de colas en
Grand Central Dispatch y colas de operacin. Ambos tipos de cola proporcionan un
modelo de ejecucin asncrono para las tareas que usted defina. Cuando se enva una
tarea a una cola, el sistema prepara un hilo y se ejecuta la tarea en ese hilo. Dejando que
el sistema de gestin de los hilos simplifique el cdigo y permite que el sistema gestione
estos hilos de la forma ms eficiente disponible.
153
Se debe utilizar siempre que sea posible las colas para realizar tareas fuera del hilo
principal de la aplicacin. Debido a que el hilo conductor es responsable de procesar
eventos de tacto y dibujar la interfaz, nunca debe realizar tareas prolongadas en l. Por
ejemplo, nunca se debe esperar una respuesta de la red en el subproceso principal de tu
aplicacin. Es mucho mejor hacer la solicitud asincrnica utilizando una cola y procesar
los resultados cuando llegan.
Otro buen momento para mover las tareas a temas secundarios es el momento del
lanzamiento. Lanzamiento de aplicaciones tienen una cantidad limitada de tiempo
(alrededor de 5 segundos) para hacer su inicializacin y comienza el procesamiento de
eventos. Si se utiliza el tiempo de lanzamiento para tareas que se pueden aplazar o
ejecutar en un subproceso secundario, debe quitarlas del hilo principal de inmediato y
usar el hilo principal slo para presentar la interfaz de usuario e iniciar el control de
eventos.
154
Mapas y localizacin
Utilizar informacin basada en localizacin en las aplicaciones es una forma de mantener
al usuario conectado con el mundo circundante. Si se utiliza esta informacin para fines
prcticos (como la navegacin) o para el entretenimiento, la informacin basada en la
ubicacin puede mejorar la experiencia general del usuario.
Para utilizar las funciones del framework Core Location, debe enlazar la aplicacin al
gframework Core Location.en el proyecto de Xcode. Para acceder a las clases y los
encabezamientos del framework hay que incluir una declaracin import
<CoreLocation/CoreLocation.h> en la parte superior de los archivos fuente
correspondientes.
Para poder usar los servicios de localizacin es necesario conocer que estn disponibles
en el dispositivo. Para que funcionen correctamente, se debe incluir la clave
UIRequiredDeviceCapabilities en el archivo Info.plist de la aplicacin.
para determinar que las radios para permitir y luego procede a notificar eventos de
ubicacin para su aplicacin.
Para utilizar el servicio de localizacin estndar, se crea una instancia de la clase
CLLocationManager y se configuran sus propiedades desiredAccuracy distanceFilter.
Para comenzar a recibir las notificaciones de ubicacin, asignar un delegado para el
objeto y llamar al mtodo startUpdatingLocation. Cuando los datos de ubicacin estn
disponible,s lel manejador de localizacin notifica al objeto delegado. Si una actualizacin
de posicin ya ha sido entregada, se pueden obtener los datos de localizacin ms
recientes directamente desde el objeto CLLocationManager sin esperar a que un nuevo
evento que se entregue. Para detener el envo de actualizaciones de ubicacin, llame al
mtodo stopUpdatingLocation del objeto de jefe de locacin.
Ejemplo de cdigo para comenzar el seervicio:
- (void)startStandardUpdates
{
// Create the location manager if this object does not
// already have one.
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
// Set a movement threshold for new events.
locationManager.distanceFilter = 500;
[locationManager startUpdatingLocation];
157
longitud y en una marca de posicin fcil de usar, que es una coleccin de datos, tales
como la calle, ciudad, estado y pas. Reverse Geocoding es el proceso de convertir una
latitud y longitud en una marca de posicin. Forward Geocoding es el proceso de
convertir la informacin en un lugar nombre latitud y longitud valor. Reverse Geocoding
es compatible con todas las versiones de iOS pero Forward Geocoding slo es
compatible con iOS 5.0 o posterior.
Debido a que los geocodificadores corren en un servicio de red, una conexin de red
activa debe estar presente para que una solicitud de codificacin geogrfica tenga xito.
Si un dispositivo est en modo avin o la red no est configurada actualmente, el
geocodificador no se puede conectar con el servicio que necesita y por lo tanto debe
devolver un error apropiado. Aqu hay algunas reglas generales para la creacin de
solicitudes de codificacin geogrfica:
Enviar como mximo una solicitud de codificacin geogrfica para cualquier accin
de usuario.
159
Para iniciar una solicitud de codificacin geogrfica inversa con la clase CLGeocoder, hay
que crear una instancia de la clase y llamar al mtodo reverseGeocodeLocation:
completionHandler: El objeto geocoder inicia la solicitud de codificacin geogrfica inversa
asncrona y entrega los resultados al objeto de bloque que usted proporciona. El objeto de
bloque se ejecuta si la solicitud tiene xito o fracasa. En el caso de un fallo, un objeto de
error se pasa al bloque que indica el motivo del fallo.
Ejemplo de cdigo que geocodifica un lugar:
@implementation MyGeocoderViewController (CustomGeocodingAdditions)
- (void)geocodeLocation:(CLLocation*)location forAnnotation:
(MapLocation*)annotation
{
if (!geocoder)
geocoder = [[CLGeocoder alloc] init];
[theGeocoder reverseGeocodeLocation:location completionHandler:
^(NSArray* placemarks, NSError* error){
if ([placemarks count] > 0)
{
annotation.placemark = [placemarks objectAtIndex:0];
// Add a More Info button to the annotation's view.
MKPinAnnotationView* view = (MKPinAnnotationView*)[map
viewForAnnotation:annotation];
if (view && (view.rightCalloutAccessoryView == nil))
{
view.canShowCallout = YES;
view.rightCalloutAccessoryView = [UIButton
buttonWithType:UIButtonTypeDetailDisclosure];
}
}
}];
}
@end
Conversin de nombres de lugares en coordenadas
En iOS 5.0 y versiones posteriores, se utiliza la clase CLGeocoder para iniciar un
Forward Geocoding utilizando ya sea un diccionario con informacin de la libreta de
direcciones o una cadena simple. Hay un formato designado para peticiones basadas en
cadenas, los caracteres delimitadores son bienvenidos, pero no es obligatorio, y el
servidor geocodificador trata la cadena como entre maysculas y minsculas. Por lo tanto,
cualquiera de las siguientes cadenas se obtendran resultados:
"Apple Inc"
"1 Infinite Loop"
"1 Infinite Loop, Cupertino, CA, EE.UU."
160
Dibujando Mapas
Introducido en iOS 3.0, el framework Map Kit permite incorporar una interfaz de mapas
completamente funcional en su aplicacin. El soporte a mapas proporcionado por este
framework incluye muchas de las caractersticas que normalmente se encuentran en
aplicaciones de Mapas. Puede mostrar informacin a nivel de plano o imgenes de
satlite, o una combinacin de los dos. Puede hacer zoom y desplazar el mapa
programacin y el framework proporciona apoyo automtico a los eventos tctiles que
permiten a los usuarios ampliar y explorar el mapa. Tambin puede anotar el mapa con
informacin personalizada.
Para utilizar las caractersticas de la estructura Mapa Kit, debe vincular su aplicacin al
framework de MapKit. en el proyecto de Xcode. Para acceder a las clases y a las
declaraciones del framework, incluya una instruccin # import <MapKit/MapKit.h> en la
parte superior de los archivos fuente correspondientes.
apropiadamente.
Se puede agregar una vista de mapa para la aplicacin mediante programacin o
mediante el Generador de Interfaz:
Para agregar un mapa mediante Interface Builder, arrastre un objeto mapa a la vista
apropiada o ventana.
Para agregar un mapa mediante programacin, se crea una instancia de la clase
MKMapView, se inicializa utilizando el mtodo initWithFrame: y a continuacin, se agrega
como un subvista a su jerarqua de vistas.
Debido a que es una vista, puede manipular la vista de mapa de la misma manera se
manipulan otras vistas. Se puede cambiar su tamao y posicin en la jerarqua de vistas,
se puede configurar sus comportamientos y tamao automticamente, y se pueden aadir
subvistas a ella. A diferencia de una vista, nunca esta maneja los eventos de toque
directamente. La vista del mapa en s es un envase opaco para una visin compleja de la
jerarqua que controla la visualizacin de mapas y datos relacionados con las
interacciones con esos datos. Si desea que un contenido permanezca fijo con respecto a
un mapa especfico de coordenadas debe utilizar las anotaciones o superposiciones.
Los nuevos mapas estn configurados para aceptar las interacciones del usuario y los
datos de visualizacin del mapa solamente. Se puede configurar el mapa para visualizar
las imgenes de satlite o una mezcla de los datos de satlite y mapa cambiando el
atributo Type del mapa en Interface Builder o cambiar el valor de la propiedad mapType.
Si desea limitar las interacciones del usuario, puede cambiar los valores de las
propiedades y zoomEnabled scrollEnabled. Si se desea responder a las interacciones del
usuario, debe hacerlo a travs de un delegadoConfiguracin de las propiedades de un mapa
La clase MKMapView tiene un puado de propiedades que se pueden configurar
mediante programacin. Estas propiedades controlan la informacin importante como qu
parte del mapa es visible actualmente y qu interacciones de los usuarios se les permite.
Ajustado de la parte visible de un mapa
La propiedad de la clase regin MKMapView controla la parte actualmente visible del
mapa. Cuando se crea por primera vez, en la regin visible de un mapa se encuentra
normalmente el mundo entero. En otras palabras, la regin abarca el rea que muestra la
mayor cantidad de mapa como sea posible. Puede cambiar esta regin en cualquier
momento mediante la asignacin de un nuevo valor a la propiedad regin. Esta propiedad
contiene una estructura MKCoordinateRegion, que tiene la siguiente definicin:
162
typedef struct {
CLLocationCoordinate2D center;
MKCoordinateSpan span;
} MKCoordinateRegion;
Responder a las interacciones del usuario en un Mapa
La clase MKMapView reporta importantes relacionados con mapas hechos a su objeto
delegado asociado. El objeto delegado es un objeto que cumple con el protocolo
MKMapViewDelegate. Se proporciona este objeto en situaciones en las que se desea
responder a los siguientes tipos de eventos:
163
Con el fin de mostrar una anotacin en un mapa, la aplicacin debe proporcionar dos
objetos distintos:
164
URLs. Imgenes cuya ubicacin se pueden especificar como una direccin URL
puede actuar como un proveedor o receptor de datos de imagen. En Image I / O,
una URL es representada en los tipo de datos Core Foundation CFURLRef .
Los objetos Core Foundation CFDataRef y CFMutableDataRef.
El consumidor de datos Quartz (CGDataConsumerRef) y elproveedor de datos
(CGDataProviderRef).
165
Se puede utilizar la funcin de CFShow para imprimir la matriz a la consola del debuger
en Xcode, como se muestra en el listado siguiente
CFArrayRef mySourceTypes = CGImageSourceCopyTypeIdentifiers();
CFShow(mySourceTypes);
CFArrayRef myDestinationTypes = CGImageDestinationCopyTypeIdentifiers();
CFShow(myDestinationTypes);
Los Strings del array devueltos por estas funciones toman la forma de com.apple.pict,
public.jpeg, public.tiff, y as sucesivamente. La tabla enumera las UTIs para muchos
formatos comunes de archivos de imagen. OS X y iOS definen constantes para la mayora
de formatos comunes de archivos de imagen, el conjunto completo de las constantes se
declaran en el archivo de cabecera UTCoreTypes.h. Se puede utilizar estas constantes
cuando es necesario especificar un tipo de imagen, ya sea como un indicio de una fuente
de imagen (kCGImageSourceTypeIdentifierHint) o como un tipo de imagen de un destino
de imagen.
Uniform type identifier
public.image
public.png
public.jpeg
public.jpeg-2000 (OS X only)
public.tiff
com.apple.pict (OS X only)
com.compuserve.gif
166
}
// Create an image from the first item in the image source.
myImage = CGImageSourceCreateImageAtIndex(myImageSource,
0,
NULL);
CFRelease(myImageSource);
// Make sure the image exists before continuing
if (myImage == NULL){
fprintf(stderr, "Image not created from image source.");
return NULL;
}
return myImage;
}
Cuando se crea una imagen a partir de una fuente de imagen, es necesario especificar un
ndice que pueda brindar un diccionario de propiedades (pares key.-value) para
especificar cosas como crear una miniatura o permitir el almacenamiento en cach.
CGImageSource Reference y CGImageProperties Reference lista las referencias y el tipo
de datos del valor esperado para cada key.
Se debe proporcionar un valor al ndice debido a que algunos formatos de archivo de
imagen permiten mltiples imgenes residentes en el mismo archivo fuente. Para un
archivo de fuente de imagen que contiene slo una imagen, hay que pasar 0. Se pueden
encontrar imgenes en un archivo de origen de la imagen mediante una llamada al la
funcin CGImageSourceGetCount.
Creacin de una imagen en miniatura a partir de una fuente de imagen
Algunos archivos de origen de imgenes contienen imgenes en miniatura (Thumbnails)
que se pueden recuperar. Si las miniaturas no estn presentes, Image I / O le da la opcin
de crearlas. Tambin puede especificar un tamao de imagen mximo y si se debe aplicar
una transformacin a la imagen en miniatura.
El siguiente ejemplo muestra cmo crear una fuente de imagen de datos, crear un
diccionario que contiene las opciones relacionadas con la miniatura, y luego crear una
imagen en miniatura. Utilice la key CGImageSourceCreateThumbnailWithTransform para
especificar si la imagen en miniatura deben rotarse y escalarse para que coincida con la
relacin de aspecto de pxeles y la orientacin de la imagen completa.
CGImageRef MyCreateThumbnailImageFromData (NSData * data, int imageSize)
{
CGImageRef
myThumbnailImage = NULL;
CGImageSourceRef myImageSource;
CFDictionaryRef myOptions = NULL;
CFStringRef
myKeys[3];
CFTypeRef
myValues[3];
CFNumberRef
thumbnailSize;
// Create an image source from NSData; no options.
myImageSource = CGImageSourceCreateWithData((CFDataRef)data,
168
NULL);
// Make sure the image source exists before continuing.
if (myImageSource == NULL){
fprintf(stderr, "Image source is NULL.");
return NULL;
}
// Package the integer as a CFNumber object. Using CFTypes allows you
// to more easily create the options dictionary later.
thumbnailSize = CFNumberCreate(NULL, kCFNumberIntType, &imageSize);
// Set up the thumbnail options.
myKeys[0] = kCGImageSourceCreateThumbnailWithTransform;
myValues[0] = (CFTypeRef)kCFBooleanTrue;
myKeys[1] = kCGImageSourceCreateThumbnailFromImageIfAbsent;
myValues[1] = (CFTypeRef)kCFBooleanTrue;
myKeys[2] = kCGImageSourceThumbnailMaxPixelSize;
myValues[2] = (CFTypeRef)thumbnailSize;
myOptions = CFDictionaryCreate(NULL, (const void **) myKeys,
(const void **) myValues, 2,
&kCFTypeDictionaryKeyCallBacks,
& kCFTypeDictionaryValueCallBacks);
// Create the thumbnail image using the specified options.
myThumbnailImage = CGImageSourceCreateThumbnailAtIndex(myImageSource,
0,
myOptions);
// Release the options dictionary and the image source
// when you no longer need them.
CFRelease(thumbnailSize);
CFRelease(myOptions);
CFRelease(myImageSource);
// Make sure the thumbnail image exists before continuing.
if (myThumbnailImage == NULL){
fprintf(stderr, "Thumbnail image not created from image source.");
return NULL;
}
return myThumbnailImage;
}
Cargado incremental de imgenes
Si se tiene una imagen muy grande, o se cargan los datos de imagen en la web, es
posible que desee crear una fuente de imagen incremental para que pueda dibujar los
datos de la imagen a medida que se acumulan. Es necesario realizar las siguientes tareas
para cargar una imagen de forma incremental desde objeto CFData:
1. Crear el objeto CFData para acumular los datos de imagen.
2. Crear un origen de imagen incremental llamando a la funcin
CGImageSourceCreateIncremental.
3. Aadir los datos de imagen para el objeto CFData.
4. Llamar a la funcin CGImageSourceUpdateData, pasando el objeto CFData y un
169
valor booleano (tipo de datos bool) que especifica si el parmetro de datos contiene
toda la imagen, o que los datos slo parciales. En cualquier caso, el parmetro de
datos debe contener todos los datos de archivo de imagen acumulados hasta ese
punto.
5. Si se han acumulado suficientes datos de imagen, crear una imagen llamando
CGImageSourceCreateImageAtIndex, que dibuja la parte de la imagen y, a
continuacin liberar el objeto.
6. Comprobar si tiene todos los datos de una imagen mediante una llamada a la
funcin CGImageSourceGetStatusAtIndex. Si la imagen se completa, esta funcin
devuelve kCGImageStatusComplete. Si la imagen no es completa, repetir los
pasos 3 y 4 hasta que sea.
7. Libere el origen de la imagen incremental.
Visualizar las propiedades de una imagen
Las fotos digitales se marcan con una gran cantidad de informacin acerca de las
dimensiones de la imagen, la resolucin, la orientacin, el perfil de color, apertura, modo
de medicin, la longitud focal, fecha de creacin, las palabras clave, ttulo, y mucho ms.
Esta informacin es muy til para el manejo de imagen y edicin, pero slo si los datos se
exponen
en
la
interfaz
de
usuario.
Aunque
la
funcin
CGImageSourceCopyPropertiesAtIndex recupera un diccionario de todas las propiedades
asociadas a una imagen en una fuente de imagen, tendr que escribir el cdigo que
recorre ese diccionario para recuperar y mostrar esa informacin.
En esta seccin vas a echar un vistazo de cerca a una rutina a partir del cdigo de
ejemplo de ImageApp OS X, que es una aplicacin de visualizacin de imgenes que se
pueden descargar y experimentar. Una de las caractersticas del cdigo de ejemplo
ImageApp es una ventana de informacin de imagen que muestra una imagen en
miniatura y las propiedades de la imagen para la imagen activa, como se muestra en la
Figura siguiente.
170
Para tener una idea de cmo se pueden utilizar las funciones CGImageSource para
soportar una aplicacin de edicin de imagen, podemos ver un ejemplo en el listado
siguiente:
- (void) setURL:(NSURL*)url
{
if ([url isEqual:mUrl])
return;
mUrl = url;
CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url,
NULL);
// 1
if (source)
{
NSDictionary* props =
(NSDictionary*) CGImageSourceCopyPropertiesAtIndex(source, 0, NULL);
// 2
[mTree setContent:[self propTree:props]];
// 3
NSDictionary* thumbOpts = [NSDictionary dictionaryWithObjectsAndKeys:
(id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform,
(id)kCFBooleanTrue,
(id)kCGImageSourceCreateThumbnailFromImageIfAbsent,
[NSNumber numberWithInt:128],
(id)kCGImageSourceThumbnailMaxPixelSize,
nil];
// 4
CGImageRef image = CGImageSourceCreateThumbnailAtIndex(source, 0,
(CFDictionaryRef)thumbOpts);
// 5
[mThumbView setImage:image];
// 6
CGImageRelease(image);
// 7
[mFilePath setStringValue:[mUrl path]];
// 8
NSString* uti = (NSString*)CGImageSourceGetType(source);
// 9
[mFileType setStringValue:[NSString stringWithFormat:@"%@\n%@",
ImageIOLocalizedString(uti), uti]];
// 10
CFDictionaryRef fileProps = CGImageSourceCopyProperties(source, nil);
// 11
[mFileSize setStringValue:[NSString stringWithFormat:@"%@ bytes",
(id)CFDictionaryGetValue(fileProps, kCGImagePropertyFileSize)]];
// 12
}
else
// 13
{
171
[mTree setContent:nil];
[mThumbView setImage:nil];
[mFilePath setStringValue:@""];
[mFileType setStringValue:@""];
[mFileSize setStringValue:@""];
}
}
Esto es lo que hace el cdigo:
1. Crea un objeto de origen de la imagen con la URL pasada a la rutina.
2. Copia las propiedades de la imagen ubicada en la posicin de ndice 0. Algunos
archivos de imagen pueden admitir ms de una imagen, pero este ejemplo se
supone que hay una sola imagen (o que la imagen de nuestro inters es la primera
en el archivo).
La funcin devuelve un objeto CGImageSourceCopyPropertiesAtIndex
CFDictionary. Aqu, el cdigo devuelve el CFDictionary como un objeto
NSDictionary, ya que estos tipos de datos son intercambiables.
El diccionario que se devuelve contiene todas las propiedades que son pares keyvalue. Sin embargo, algunos de los valores son en s mismos diccionarios que
contienen propiedades.
3. Extrae las propiedades del diccionario y los pone a un controlador de rbol. Si nos
fijamos en el archivo ImageInfoPanel.h, se ver que la variable es un objeto mTree
NSTreeController que es una salida en Interface Builder. Este controlador gestiona
un rbol de objetos. En este caso, los objetos son propiedades de la imagen.
El mtodo propTree: es proporcionado por el archivo ImageInfoPanel.m. Su
propsito es recorrer las propiedades del diccionario recuperado en el paso
anterior, extraer las propiedades de la imagen, y construir la matriz que est
enlazado al objeto NSTreeController.
Las propiedades aparecen en una tabla de key-value.
4. Establece un diccionario de opciones para utilizar cuando se crea una imagen de la
fuente de imagen. Recordemos que las opciones se pasan en un diccionario. El
panel de informacin muestra una imagen en miniatura. El cdigo de aqu
establece opciones que crean una imagen en miniatura que se hace girar y escalar
a la misma orientacin y relacin de aspecto de la imagen completa. Si la miniatura
no existe, se crea uno, y su tamao mximo es de 128 pxeles por 128 pxeles.
5. Se crea una imagen en miniatura de la primera imagen de la fuente de la imagen,
utilizando las opciones establecidas en el paso anterior.
6. Se establece la imagen en miniatura en la vista en el panel Informacin.
7. Se libera la imagen, sino que ya no se necesita.
8. Se extrae la ruta de la URL se pasa al mtodo, y se establece la cadena al campo
de texto que est destinado en el panel Informacin.
9. Se obtiene el identificador del tipo de la fuente de imagen. (Esto puede ser
diferente del tipo de las imgenes de la fuente.)
10. Se llama a una funcin para recuperar la cadena localizada por la UTI
(ImageIOLocalizedString se declara en el fichero ImagePanel.m) y luego se
establece la cadena para el campo de texto que est destinado en el panel
Informacin.
11. Se recupera un diccionario de las propiedades asociadas con el origen de la
imagen. Estas propiedades se aplican al contenedor (por ejemplo, el tamao del
172
Bibliografa
Programming in Objective-C
Autor: Stephen G. Kochan
Editorial: Developers Library
iPhone Programming
Autores: Joe Conaway & Aaron Hillegas
Editorial: Big Nerd Ranch,
Aplicaciones iPhone e iPad para Principiantes
Autor: Rory Lewis
Editorial: Apress
Enlaces de Inters
https://developer.apple.com
http://mobile.tutsplus.com/tutorials/
https://developer.apple.com/support/
http://nshipster.com
http://www.ipadsfera.com
http://www.raywenderlich.com
175