154
Contenido del curso Manual IOS Avanzado Curso de desarrollo de aplicaciones en plataforma IOS

Manual IOS Avanzado v1.2(v Final)

  • Upload
    jcortmx

  • View
    35

  • Download
    7

Embed Size (px)

DESCRIPTION

Manual de Curso avanzado de IOS V1.2

Citation preview

  • Contenido del curso

    Manual IOS

    Avanzado Curso de desarrollo de

    aplicaciones en plataforma

    IOS

  • 1

    Tabla de contenido Manejo de directorios............................................................................................................ 4

    Cambiar Directorios ........................................................................................................... 5

    Crear Leer y Borrar Directorios............................................................................................ 5

    Listar contenido de un directorio ........................................................................................ 6

    Obtener atributos de un archivo o directorio ....................................................................... 7

    Manejo de archivos ............................................................................................................... 7

    Verificar si existe un archivo ............................................................................................... 8

    Comparacin de dos archivos ............................................................................................. 8

    Verificando los permisos del archivo ................................................................................... 9

    Mover o renombrar un archivo ........................................................................................... 9

    Copiar un archivo ............................................................................................................. 10

    Borrar un archivo ............................................................................................................. 10

    Crear un link simblico ..................................................................................................... 10

    Leer y escribir archivos con NSFileManager ....................................................................... 11

    Crear un objeto NSFileHandle ........................................................................................... 12

    Proceso de desplazamiento (Offsets) y bsqueda (Seeking) ................................................ 12

    Leer datos en un archivo .................................................................................................. 13

    Escribir los datos en el archivo .......................................................................................... 14

    Base de Datos...................................................................................................................... 16

    Qu es SQLite? ............................................................................................................... 16

    Historia........................................................................................................................... 16

    Caractersticas............................................................................................................... 16

    Plataformas de SQLite .................................................................................................. 17

    Aplicaciones de SQLite ................................................................................................. 17

    Estructurar BD ................................................................................................................. 18

    Abrir o Crear una BD......................................................................................................... 18

    Crear Tabla de BD............................................................................................................. 19

    Prepara y Ejecutar sentencias SQL..................................................................................... 19

    Integrar SQL Lite en proyecto............................................................................................ 21

    Extraer informacin de una BD. ........................................................................................ 23

    Multitouch, Tap, y Gestos .................................................................................................... 35

  • 2

    Gestos, Taps y Touches..................................................................................................... 35

    Crear una aplicacin con Gestos........................................................................................ 37

    Detectar Gestos dentro de la pantalla ............................................................................... 45

    Integracin de Mapas .............................................................................................................. 73

    Adicionar Mapa ................................................................................................................... 73

    Ubicar posicin.................................................................................................................... 78

    Calcular distancias ............................................................................................................... 82

    Cmara ............................................................................................................................... 83

    Crear Aplicacin con cmara. ............................................................................................ 83

    Manejo de imgenes. ....................................................................................................... 91

    Carga de una Imagen desde Internet ................................................................................. 95

    Carga de una imagen desde la Galera de fotos .................................................................. 96

    Ejercicio subir imgenes a servicio..................................................................................... 97

    Redes Sociales........................................................................................................................102

    Uso de SL Request. ..........................................................................................................102

    Integrar Twitter...............................................................................................................106

    Integrar Facebook. ..........................................................................................................108

    Disear interface de usuario. ...........................................................................................111

    Realizar "testing" a la aplicacin.......................................................................................115

    XML & JSON. ..........................................................................................................................118

    Crear, modificar, eliminar archivos XML & JSON. ..................................................................118

    Subir archivos a Web Service o FTP. .....................................................................................122

    Crear certificados y aprovisionar perfiles. ................................................................................122

    Tipos de licencias de desarrollo ...........................................................................................122

    Apple Developer .............................................................................................................122

    iOS University Program....................................................................................................123

    iOS Developer Program ...................................................................................................123

    iOS Developer Enterprise Program ...................................................................................123

    Crear un certificado de desarrollo........................................................................................123

    Instalar un App dentro de un dispositivo. .............................................................................125

    Crear un App ID ..................................................................................................................126

    Asociar un App ID con un APP..............................................................................................127

  • 3

    Crear un aprovisionamiento de perfil de desarrollo. .............................................................128

    Compatibilidad de versiones. ..............................................................................................129

    Anexo ....................................................................................................................................130

    Agregar icono a la aplicacin ...............................................................................................130

    Archivar aplicacin para distribucin ...................................................................................138

    Proceso de distribucin inalmbrica de apps ....................................................................138

    Catlogo de apps internas ...............................................................................................138

    Administracin de actualizaciones....................................................................................139

    Administracin de dispositivos mviles ............................................................................139

    Configurar la aplicacin en ITunes........................................................................................139

    Registrarse como Apple Developer...................................................................................139

    Entrando en el programa iOS Developer Program .............................................................140

    Instalando Xcode: entorno de desarrollo ..........................................................................140

    iOS Provisioning portal: certificados .................................................................................140

    iOS Provisioning portal: dispositivos de entorno de pruebas ..............................................141

    iOS Provisioning portal: App ID y Provisioning ...................................................................141

    Programar la aplicacin en Objective C.............................................................................141

    Probar en iPhone/iPad/iPod ............................................................................................142

    Subiendo la App a App Store con iTunes Connect..............................................................142

  • 4

    Manejo de directorios

    Las clases NSFileManager, NSFileHandle y NSData

    NSFileManager - Esta clase puede ser utilizada para realizar operaciones bsicas con archivos o

    carpetas como crear, mover, leer y escribir archivos y leer y modificar los atributos de los mismos.

    Tambin cuenta con mtodos para manejar los directorios, como leer su contenido, moverlos,

    borrarlos, etc.

    NSFileHandle - Esta clase provee de operaciones de bajo nivel y de alto rendimiento, como

    bsqueda, lectura y escritura de archivos.

    NSData - Esta clase maneja un buffer donde se puede leer y escribir los datos en un archivo.

    Para las clases que se mencionan, los archivos se manejan como en UNIX. Utilizamos la diagonal

    (/) para separar las carpetas. Si no inicia con la diagonal, entonces se considera a partir de l

    directorio actual.

    La carpeta inicial (o home) del cual puede el usuario iniciar, se maneja con una tilde (~). Si un

    archivo se escribe como ~/miArchivo.m se hace referencia al archivo raz del usuario. Tambin se

    puede hacer la referencia a un directorio raz de un usuario por medio de la tilde, por

    ejemplo ~desarroll/demo.m, busca el directorio raz del usuario "desarrollo".

    La clase NSFileManager contiene un mtodo llamado defaultManager podemos obtener la

    referencia a la carpeta donde se encuentra la aplicacin:

    NSFileManager *raiz;

    raz = [NSFileManager defaultManager];

    A partir de este archivo, podemos utilizarlo de como apuntador para a partir de l, leer archivos y

    directorios.

    Definir el directorio actual

    El directorio de trabajo se puede obtener con el mtodo currentDirectoryPath de la clase

    NSFileManager. El mtodo regresa el valor como una cadena NSString:

    NSFileManager *raiz;

    NSString *directorioActual;

    raiz = [NSFileManager defaultManager];

  • 5

    directorioActual = [raiz currentDirectoryPath];

    NSLog (@"El directorio actual es %@", directorioActual);

    Cambiar Directorios

    Por medio del mtodo changeCurrentDirectoryPath podemos cambiar de directorio de la

    aplicacin. El nuevo destino del directorio es pasada como parmetro como un objetoNSString.

    Este mtodo regresar un valor Booleano (YES/NO) para indicar si el cambio se efectu en forma

    exitosa o si existi un error:

    NSFileManager *raiz;

    NSString *dirActual;

    raiz = [NSFileManager defaultManager];

    dirActual = [raiz currentDirectoryPath];

    NSLog (@"El directorio actual es %@", dirActual);

    if ([raiz changeCurrentDirectoryPath: @"/temp/mydir"] == NO)

    NSLog (@"Error al cambiar de directorio.");

    dirActual = [raiz currentDirectoryPath];

    NSLog (@"El directorio actual es %@", dirActual);

    Crear Leer y Borrar Directorios

    Crear un directorio

    Podemos crear un nuevo directorio por medio del mtodo createDirectoryAtURL pasndole como

    un argumento a una instancia de la clase NSURL. Podemos pasarle diferentes atributos para el

    directorio:

    NSFileManager *raiz;

    raiz = [NSFileManager defaultManager];

    NSURL *newDir = [NSURL fileURLWithPath:@"/tmp/mynewdir"];

    [raiz createDirectoryAtURL: newDir withIntermediateDirectories:YES

    attributes: nil error:nil];

  • 6

    El mtodo createDirectoryAtURL regresa un valor booleano indicando si la operacin fue exitosa o

    no.

    Borrar un directorio

    Un directorio puede ser borrado del disco del sistema utilizando el mtodo removeItemAtPath,

    pasando como argumento el directorio que se desee eliminar:

    NSFileManager *raiz;

    raiz= [NSFileManager defaultManager];

    [raiz removeItemAtPath: @"/tmp/mynewdir" handler: nil];

    Renombrar o mover un directorio

    Un directorio puede ser movido o renombrado usando el mtodo moveItemAtURL. Este mtodo

    toma como argumentos el origen y el destino por medio de objetos NSURL y es necesario que el

    objeto final NO EXISTA. Si el objeto destino ya existe, el mtodo regresara un valor booleano

    negativo (NO):

    NSFileManager *raiz;

    raiz = [NSFileManager defaultManager];

    NSURL *dirOrigen= [NSURL fileURLWithPath:@"/tmp/mynewdir"];

    NSURL *dirNuevo= [NSURL fileURLWithPath:@"/tmp/mynewdir2"];

    [raiz moveItemAtURL: dirOriegan toURL: dirNuevo error: nil];

    Listar contenido de un directorio

    La lista de los archivos contenidos en un directorio se puede obtener por medio del mtodo

    contentsOfDirectoryAtPath. Este mtodo toma como argumento el camino del directorio que se

    desea leer como una cadena NSString y regresa un arreglo con los nombre de los archivos y

    subdirectorios contenidos:

    NSFileManager *raiz;

    NSString *dirActual;

    NSArray *listaArchivos;

    int num;

  • 7

    int i;

    raiz= [NSFileManager defaultManager];

    listaArchivos= [raiz contentsOfDirectoryAtPath: @"/tmp" error: nil];

    num= [listaArchivos count];

    for (i = 0; i < num; i++)

    NSLog (@"%@", [listaArchivos objectAtIndex: i]);

    Obtener atributos de un archivo o directorio

    Los atributos de un archivo o directorio se pueden obtener usando el mtodo

    attributesOfItemAtPath. Este toma como argumentos la ruta del directorio y un objeto NSError

    opcional en el que se colocar la informacin sobre cualquier error (puede especificarse como

    NULL si no se requiere esta informacin). Los resultados se devuelven en forma de un objeto de

    diccionario NSDictionary.

    NSFileManager *filemgr;

    NSDictionary *attribs;

    filemgr=[NSFileManager defaultManager];

    attribs=[filemgr attributesOfItemAtPath:

    @"/Applications" error:Null];

    NSLog (@"File Type %@",[attribs objectForKey:NSFileType]);

    NSLog (@"POSIX Permissions %@",[attribs

    objectForKey:NSFilePosixPermissions]);

    Manejo de archivos

    Uno de los temas ms importantes para hacer aplicaciones robustas con Objective-C es el manejo

    de archivos.

    El directorio por referencia

  • 8

    1. Primero debemos de obtener el directorio de la aplicacin, la cual por lo general la

    conocemos como "home", "root" o "raiz".

    2. Esta referencia raz la obtenemos con el mtodo defaultManager de la claseNSFileManager, creando una instancia de la misma:

    NSFileManager *raiz;

    raiz= [NSFileManager defaultManager];

    Verificar si existe un archivo

    1. La clase NSFileManager contiene un mtodo llamado fileExistsAtPath el cual

    verifica la existencia de un archivo.

    2. El mtodo toma como argumento una cadena NSString y regresar un valor

    booleano verdadero (YES) si el archivo existe o un valor negativo (NO) de lo contrario:

    NSFileManager *raiz;

    raiz = [NSFileManager defaultManager];

    if ([raiz fileExistsAtPath: @"/tmp/myfile.txt" ] == YES)

    NSLog (@"Si existe el archivo");

    else

    NSLog (@"Archivo no encontrado");

    Comparacin de dos archivos

    Podemos comparar el contenido de dos archivos por medio del mtodo contentsEqualAtPath. Este

    mtodo toma como argumentos al nombre y el directorio de los dos archivos. Regresa un valor

    falso (NO) si es que son diferentes y un verdadero (YES) si los contenidos son iguales:

    NSFileManager *raiz;

    raiz= [NSFileManager defaultManager];

    if ([raiz contentsEqualAtPath: @"/tmp/compras.txt" andPath:

    @"/tmp/ventas.txt"] == YES)

    NSLog (@"Los contenidos son iguales");

    else

    NSLog (@"Los contenidos son diferentes");

  • 9

    Verificando los permisos del archivo

    La mayora de los sistemas operativos (de servidores, locales o de dispositivos mviles) asignan

    "permisos" a cada archivo y directorio. Por medio de los siguientes mtodos podemos saber si se

    cuenta con el permiso

    respectivo: isReadableFileAtPath,isWritableFileAtPath, isExecutableFileAtPath y isDeletableFileAtP

    ath. Cada uno regresa un valor booleano verdadero (YES) si el archivo tiene ese permiso o un falso

    (NO) si no lo tiene

    NSFileManager *raiz;

    raiz = [NSFileManager defaultManager];

    if ([raiz isWritableFileAtPath: @"/tmp/myfile.txt"] == YES)

    NSLog (@"El archivo tiene permiso para ser escrito");

    else

    NSLog (@"El archivo es slo lectura");

    Mover o renombrar un archivo

    Un archivo puede ser renombrado, en caso que tenga ese permiso, usando el mtodo

    moveItemAtURL. Este mtodo regresar un valor booleano verdadero (YES) si la accin de

    renombrar fue exitosa y uno falso (NO) de lo contrario. Se tiene un objeto de tipo error NSError, el

    cual devuelve un valor nil si la operacin fue exitosa, y un objeto de error si la operacin de

    renombrar fall:

    NSFileManager *raiz;

    raiz = [NSFileManager defaultManager];

    NSURL *dirAct = [NSURL fileURLWithPath:@"/tmp/archivoActual.txt"];

    NSURL *dirNuevo= [NSURL fileURLWithPath:@"/tmp/archivoNuevo.txt"];

    [raiz moveItemAtURL: dirAct toURL: dirNuevo error: nil];

  • 10

    Copiar un archivo

    Por medio del mtodo copyItemAtPath es posible copiar un archivo. Los argumentos y valores de

    respuesta son los mismos que en el proceso de renombrar el archivo que se vieron en el segmento

    anterior.

    NSFileManager *raiz;

    raiz= [NSFileManager defaultManager];

    if ([raiz copyItemAtPath: @"/tmp/archivoActual.txt" toPath:

    @"/Users/demo/archivoNuevo.txt" error: NULL] == YES)

    NSLog (@"Copia exitosa");

    else

    NSLog (@"Error en la copia");

    Borrar un archivo

    El mtodo removeItemAtPath permite borrar o remover un archivo. El mtodo toma el nombre de

    archivo con su camino (opcional) y un objeto de la clase NSError. Regresa un valor booleano en

    respuesta a la operacin, indicando si la misma fue exitosa (YES) o no (NO).

    NSFileManager *raiz;

    raiz = [NSFileManager defaultManager];

    if ([raiz removeItemAtPath: @"/tmp/miArchivo.txt" error: NULL] == YES)

    NSLog (@"Borrado exitoso");

    else

    NSLog (@"Error al borrar");

    Crear un link simblico

    Podemos crear un link simblico a un archivo por medio del mtodo createSymbolicLinkAtPath.

    Los argumentos de este mtodo son el camino que deseamos volver link simblico, el nombre del

    archivo y un objeto de la clase NSError, que regresa algn valor si la operacin no fue satisfactoria.

  • 11

    NSFileManager *raiz;

    raiz = [NSFileManager defaultManager];

    if ([raiz createSymbolicLinkAtPath: @"/tmp/archivo2.txt"

    withDestinationPath: @"/tmp/archivo.txt" error: nil] ==

    YES)

    NSLog (@"Ligado exitoso");

    else

    NSLog (@"Error al crear el link");

    Leer y escribir archivos con NSFileManager

    Una forma muy bsica y limitada de leer y escribir archivos es por medio de la clase

    NSFileManager.

    El contenido que se va a grabar debe de estar contenido en un objeto de tipo NSData antes de

    utilizar el mtodo contentsAtPath:

    NSFileManager *raiz;

    NSData *databuffer;

    raiz = [NSFileManager defaultManager];

    databuffer = [raiz contentsAtPath: @"/tmp/archivo.txt" ];

    Una vez que los datos estn almacenados en el objeto NSData, podemos utilizar el

    mtodo createFileAtPath para escribir el archivo:

    databuffer = [raiz contentsAtPath: @"/tmp/archivo.txt" ];

    [raiz createFileAtPath: @"/tmp/ArchivoNuevo.txt" contents: databuffer

    attributes: nil];

    Esta forma de crear un archivo no nos permite saber cunta informacin se copi ni hacer una

  • 12

    operacin de append al final del mismo. Si el archivo destino ya existe, se sobrescribe perdiendo

    los datos anteriores. Una forma mucho ms robusta de grabar informacin es por medio de la clase NSFileHandle perteneciente al Framework-Fundation.

    Uso de la clase NSFileHandle para la operacin con archivos

    La clase NSFileHandle ofrece una amplia gama de mtodos diseados para proporcionar un

    mecanismo ms avanzado para trabajar con archivos. Adems de los archivos, esta clase tambin

    se puede utilizar para trabajar con dispositivos y conectores de red. En las siguientes secciones

    vamos a ver algunos de los usos ms comunes de esta clase.

    Crear un objeto NSFileHandle

    Un objeto NSFileHandle al abrir un archivo para leer, escribir o aadir datos al final del mismo.

    Para ello se pueden utilizar, respectivamente, los siguientes mtodos:

    fileHandleForReadingAtPath,

    fileHandleForWritingAtPath

    fileHandleForUpdatingAtPath

    Una vez efectuado su operacin, se deber cerrar con el mtodo closeFile. Si el proceso de

    apertura del archivo falla, el mtodo regresar un valor de nil.

    NSFileHandle *archivo;

    archivo = [NSFileHandle fileHandleForWritingAtPath: @"/tmp/archivo.txt"];

    if (archivo == nil)

    NSLog(@"Error al abrir el archivo");

    [archivo closeFile];

    Proceso de desplazamiento (Offsets) y bsqueda (Seeking)

    1. Un objeto de la clase NSFileHandle mantiene un apuntador para marcar la

    posicin actual del archivo.

    2. Esta posicin se le conoce como offset, o el desplazamiento del apuntador con

    respecto al inicio del archivo.

    3. Cuando el archivo es abierto, este apuntador se encuentra al inicio del mismo y su

    valor es cero (0).

  • 13

    4. Esto quiere decir que cualquier operacin iniciar con un valor del apuntador de

    cero.

    5. Para efectuar una operacin en otra parte del archivo, digamos al final,

    necesitamos primero buscar (seek) ese desplazamiento (offset).

    6. Por ejemplo, si desea mover el apuntador al final del archivo, puede hacerlo por

    medio del mtodo seekToEndOfFile .

    7. Si desea mover el apuntador a un lugar en especfico, puede utilizar el mtodo

    seekToFileOffset el cual le permite especificar el lugar exacto dentro del archivo.

    8. Para identificar el lugar donde se encuentra el apuntador, puede hacerlo con el

    mtodo offsetInFile.

    9. Para que el apuntador pueda almacenar su ubicacin en un archivo muy grande,

    su tipo es un entero unsigned long long.

    Por ejemplo:

    NSFileHandle * archivo;

    archivo = [NSFileHandle fileHandleForUpdatingAtPath:

    @"/tmp/archivo.txt"];

    if (archivo == nil)

    NSLog(@"Error al abrir el archivo");

    NSLog (@"Offset = %llu", [archivo offsetInFile]);

    [archivo seekToEndOfFile];

    NSLog (@"Offset = %llu", [archivo offsetInFile]);

    [archivo seekToFileOffset: 30];

    NSLog (@"Offset = %llu", [archivo offsetInFile]);

    [archivo closeFile];

    Leer datos en un archivo

    1. Una vez que se ha abierto el archivo y que tenemos la referencia, el contenido del

    mismo puede ser ledo a partir de la posicin del apuntador (offset).

    2. El mtodo readDataOfLength lee un nmero especificado de nmeros de bytes a

    partir del apuntador (offset).

    3. Por ejemplo, el siguiente cdigo lee 5 bytes a partir de la posicin 10 a partir del

    inicio del archivo.

  • 14

    4. La informacin leda es encapsulada dentro de un objeto NSData:

    NSFileHandle * archivo;

    NSData *databuffer;

    archivo = [NSFileHandle fileHandleForReadingAtPath: @"/tmp/archivo.txt"];

    if (archivo == nil)

    NSLog(@"Failed to open file");

    [archivo seekToFileOffset: 10];

    databuffer = [archivo readDataOfLength: 5];

    [archivo closeFile];

    El mtodo readDataToEndOfFile lee los datos encontrados desde el offset hasta el fin del archivo.

    Escribir los datos en el archivo

    El mtodo writeData escribe la informacin encontrada en un objeto NSData a partir de la

    ubicacin del apuntador u offset.

    Este proceso no inserta datos, ms bien los sobrescribe.

    Para ver este comando en accin, cree un archivo de texto con la sentencia:

    hola, cara de bola

    A continuacin ejecute el siguiente cdigo:

    #import

    int main (int argc, const char * argv[])

    {

    @autoreleasepool {

    NSFileHandle * archivo;

    NSMutableData *data;

    const char *bytestring = "black dog";

    data = [NSMutableData dataWithBytes:bytestring

    length:strlen(bytestring)];

  • 15

    archivo = [NSFileHandle fileHandleForUpdatingAtPath:

    @"/tmp/archivo.txt"];

    if (archivo == nil)

    NSLog(@"Error al abrir el archivo");

    [archivo seekToFileOffset: 10];

    [archivo writeData: data];

    [archivo closeFile];

    }

    return 0;

    }

    Abra con un editor el archivo para ver el cambio.

    Truncar un archivo

    Un archivo puede ser truncado por medio del mtodo truncateFileAtOffset.

    Para borrar todo el contenido del archivo, el apuntador u offset deber encontrarse al inicio del

    archivo, es decir, ser cero:

    NSFileHandle * archivo;

    archivo = [NSFileHandle fileHandleForUpdatingAtPath:

    @"/tmp/archivo.txt"];

    if (archivo == nil)

    NSLog(@"Error al abrir el archivo");

    [archivo truncateFileAtOffset: 0];

    [archivo closeFile];

  • 16

    Base de Datos

    El uso de las bases de datos ya se ha extendido de los servidores hacia los dispositivos

    mviles. El desarrollo constante de la tecnologa conjuntamente con los nuevos

    requerimientos de las empresas ha llevado a crear diversos mtodos de almacenamiento de

    informacin en dispositivos mviles, embebidos y empotrados.

    La demanda de bases de datos para dispositivos mviles como PDAs y telfonos celulares ha

    crecido exponencialmente en los ltimos aos debido a la necesidad de las empresas de tener

    la informacin al instante de lo que sucede en el campo y as responder ms rpidamente ante

    la competencia. Esta necesidad ha provocado que el almacenamiento de los datos en estos

    dispositivos haya mejorado tanto en capacidad como en herramientas. Gracias a esto,

    actualmente contamos con diversas opciones de manejadores de bases de datos para

    mviles, y una de mis favoritas es SQLite, que es en la que se enfoca este artculo.

    Qu es SQLite?

    SQLite es una herramienta de software libre, que permite almacenar informacin en

    dispositivos empotrados de una forma sencilla, eficaz, potente, rpida y en equipos con pocas

    capacidades de hardware, como puede ser una PDA o un telfono celular. SQLite implementa

    el estndar SQL92 y tambin agrega extensiones que facilitan su uso en cualquier ambiente

    de desarrollo. Esto permite que SQLite soporte desde las consultas ms bsicas hasta las

    ms complejas del lenguaje SQL, y lo ms importante es que se puede usar tanto en

    dispositivos mviles como en sistemas de escritorio, sin necesidad de realizar procesos

    complejos de importacin y exportacin de datos, ya que existe compatibilidad al 100% entre

    las diversas plataformas disponibles, haciendo que la portabilidad entre dispositivos y

    plataformas sea transparente.

    Historia

    SQLite apareci en mayo del ao 2000 de la mano de su creador D. Richard Hip, quin ha

    liberado las diferentes versiones de SQLite en base a la licencia GPL por lo que su cd igo es

    de dominio pblico y puede ser modificado por cualquier persona. Gracias a esto, SQLite ha

    sido mejorada a lo largo de 7 aos por un gran nmero de colaboradores y tambin ha sido

    migrada a diversas plataformas.

    Caractersticas

    Estas son algunas de las caractersticas principales de SQLite:

    La base de datos completa se encuentra en un solo archivo.

    Puede funcionar enteramente en memoria, lo que la hace muy rpida.

    Tiene un footprint menor a 230KB.

    Es totalmente autocontenida (sin dependencias externas).

    Cuenta con libreras de acceso para muchos lenguajes de programacin.

  • 17

    Soporta texto en formato UTF-8 y UTF-16, as como datos numricos de 64 bits.

    Soporta funciones SQL definidas por el usuario (UDF).

    El cdigo fuente es de dominio pblico y se encuentra muy bien documentado.

    Plataformas de SQLite

    SQLite est construida en C, lo cual facilita la migracin a diversas plataformas de sistemas

    operativos y de dispositivos. Dado que una base de datos de SQLite se almacena por

    completo en un solo archivo, est puede ser exportada a cualquier otra plataforma y tener

    interoperatibilidad al 100% sin ningn requerimiento de programacin adicional o cambios de

    configuracin.

    Las plataformas principales dnde SQLite se encuentra funcionando son:

    Windows 95, 98, ME, 2000, XP y Vista

    Windows CE & Pocket PC

    Mac OSX

    Linux

    OpenEmbedded

    PalmOS

    Symbian

    Aplicaciones de SQLite

    Las caractersticas y plataformas previamente mencionadas hacen de SQLite una excelente

    opcin en diversos casos tales como:

    Cuando se requiere una base de datos integrada dentro de una aplicacin. SQLite es una

    excelente opcin por su facilidad de configuracin. El inconveniente es que no escala a bases

    de datos demasiado grandes (en el orden de los terabytes).

    Para realizar demostracin de aplicaciones que utilizan un RDBMS (Para que utilizar un

    manejador de BD pesado que ocupa grandes recursos de sistema cuando solo se requiere

    hacer un demo de una aplicacin?)

    Como cache local de un manejador de base de datos empresarial. Esto acelera el tiempo de

    respuesta y reduce la carga sobre la base de datos central.

    Para aplicaciones en dispositivos mviles que manejan una BD local que se sincroniza por

    batch con una base de datos remota.

    Almacenamiento persistente de objetos, configuraciones y preferencias de usuario. Permite

    fcilmente crear una estructura para almacenar configuraciones de la aplicacin.

  • 18

    Estructurar BD

    Si deseamos conocer la estructura de una base de datos SQLite tan solo tenemos que hacer un

    SELECT a la tabla sqlite_master.

    Esta tabla es una tabla especial de SQLite que conserva la estructura de todo el fichero de la base

    de datos, por lo tanto nos informa de todas las tablas que contiene y sus respectivos campos.

    Por ejemplo, para volcar la informacin:

    SELECT * FROM sqlite_master

    Y para ver la definicin (en formato SQL) de la tablas, realizamos una consulta sobre el

    campo sql del tipo table con:

    SELECT sql FROM sqlite_master WHERE type='table'

    Abrir o Crear una BD.

    En primer lugar, necesitamos crear las tablas de nuestra base de datos. Para ello, nos

    descargaremos el addon de Firefox SQLite Database Manager. Si no utilizamos Firefox, tambin

    podemos descargar un gestor desde SQLAbs. Ejecutamos el addon y creamos una nueva base de

    datos, utilizando el botn que se indica en la imagen:

  • 19

    Elegimos el nombre que queramos. Una vez aceptemos, nos crear un fichero .sqlite con el

    nombre que hayamos elegido en la ubicacin que queramos. Para este ejemplo, hemos elegido el

    nombre vehiculos.sqlite.

    Crear Tabla de BD.

    A continuacin hacemos click en el botn de Crear Tabla y podremos crear la primera tabla de

    nuestra nueva base de datos. Rellenamos los campos tal y como se ve en la siguiente imagen:

    Prepara y Ejecutar sentencias SQL

    Una vez creada nuestra tabla, vamos a insertar algunos datos de prueba en ella. Para ello,

    desplegamos la seccin de Tables y despus seleccionamos nuestra tabla. Con nuestra tabla

    seleccionada, en la parte derecha de la ventana veremos un botn que nos permitir aadir una

    nueva fila a la tabla. En la siguiente imagen vemos de qu botn se trata:

  • 20

    Nos aparecer una ventana con los tres campos de la tabla para rellenar. Insertamos los datos que

    queramos (para este ejercicio, con tres vehculos nos bastar) rellenando todos los campos y

    confirmando los cambios cuando el programa nos lo pida. Repetimos la operacin hasta completar

    el nmero de vehculos que queramos. Para finalizar, una vez hayamos insertado el ltimo,

    hacemos click en el botn de cancelar y nos aparecer lo siguiente por pantalla:

  • 21

    Con esto terminan nuestras operaciones con el gestor de base de datos.

    Integrar SQL Lite en proyecto

    A continuacin vamos a crear el proyecto de XCode con el que crearemos nuestra aplicacin.

    Elegimos un proyecto de tipo Single View Application y lo nombramos como queramos, en este

    caso hemos elegido el nombre VehiculosCRUD. Indicaremos que la aplicacin ser para iPhone,

    utilizar Storyboards y tambin utilizar ARC.

    Una vez hayamos creado el proyecto, nos dirigimos a la seccin de Linked Frameworks and

    Libraries y aadimos una nueva entrada con el botn +. En el buscador que se nos abre, buscamos

    la librera libsqlite3.0.dylib y la aadimos. Ahora, buscamos el fichero que contiene nuestra base

    de datos, la cual hemos creado antes y lo arrastramos a la lista de ficheros del proyecto. En la

    pantalla que aparece, dejamos las opciones tal y como se ven en la siguiente imagen:

  • 22

    Ahora vamos a crear las operaciones. Primero crearemos un grupo y lo haremos desde el men

    File y seleccionando la opcin New Group. Le pondremos como nombre modelo. Una vez creado el

    nuevo grupo, crearemos la clase que nos mapear la tabla de vehculo. La clase la crearemos

    seleccionando el nuevo grupo y, desde el men contextual, seleccionaremos New File. Elegimos

    Objective-C class, le indicamos que ser una subclase de NSObject y la llamaremos Vehiculo. Una

    vez la creemos, le aadimos las propiedades necesarias para mapear los campos de la tabla de

    base de datos, tal y como podemos ver en el siguiente cdigo:

    Vehiculo.h

    #import

    @interface Vehiculo : NSObject{

    NSInteger vehiculoID;

    NSString *nombreVehiculo;

    NSInteger numeroRuedas;

    }

    @property (nonatomic, assign) NSInteger vehiculoID;

    @property (nonatomic, retain) NSString *nombreVehiculo;

    @property (nonatomic, assign) NSInteger numeroRuedas;

    @end

  • 23

    Vehiculo.m

    #import "Vehiculo.h"

    @implementation Vehiculo

    @synthesize vehiculoID;

    @synthesize nombreVehiculo;

    @synthesize numeroRuedas;

    @end

    A continuacin creamos la clase que nos permitir realizar las operaciones contra la base de datos.

    Esta clase tambin la crearemos dentro del grupo modelo. Repetimos la misma operacin con la

    que creamos la clase Vehiculo: Objective-C class, subclase de NSObject y la llamaremos

    VehiculoDAO.

    Extraer informacin de una BD.

    Una vez creada, le aadiremos las propiedades necesarias y definiremos los mtodos de obtener

    datos y obtener la ruta de base de datos, tal y como podemos ver en el siguiente cdigo:

    VehiculoDAO.h

    #import

    #import

    @interface VehiculoDAO : NSObject{

    sqlite3 *bd;

    }

    - (NSMutableArray *) obtenerVehiculos;

    - (NSString *) obtenerRutaBD;

    @end

    VehiculoDAO.m

    #import "VehiculoDAO.h"

    #import "Vehiculo.h"

    @implementation VehiculoDAO

    - (NSString *) obtenerRutaBD{

    NSString *dirDocs;

    NSArray *rutas;

    NSString *rutaBD;

    rutas = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,

    NSUserDomainMask, YES);

    dirDocs = [rutas objectAtIndex:0];

  • 24

    NSFileManager *fileMgr = [NSFileManager defaultManager];

    rutaBD = [[NSString alloc] initWithString:[dirDocs

    stringByAppendingPathComponent:@"vehiculos.sqlite"]];

    if([fileMgr fileExistsAtPath:rutaBD] == NO){

    [fileMgr copyItemAtPath:[[[NSBundle mainBundle] resourcePath]

    stringByAppendingPathComponent:@"vehiculos.sqlite"] toPath:rutaBD

    error:NULL];

    }

    return rutaBD;

    }

    - (NSMutableArray *) obtenerVehiculos{

    NSMutableArray *listaVehiculos = [[NSMutableArray alloc] init];

    NSString *ubicacionDB = [self obtenerRutaBD];

    if(!(sqlite3_open([ubicacionDB UTF8String], &bd) == SQLITE_OK)){

    NSLog(@"No se puede conectar con la BD");

    }

    const char *sentenciaSQL = "SELECT id, nombre_vehiculo,

    numero_ruedas FROM vehiculo";

    sqlite3_stmt *sqlStatement;

    if(sqlite3_prepare_v2(bd, sentenciaSQL, -1, &sqlStatement, NULL)

    != SQLITE_OK){

    NSLog(@"Problema al preparar el statement");

    }

    while(sqlite3_step(sqlStatement) == SQLITE_ROW){

    Vehiculo *vehiculo = [[Vehiculo alloc] init];

    vehiculo.vehiculoID = sqlite3_column_int(sqlStatement, 0);

    vehiculo.nombreVehiculo = [NSString

    stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 1)];

    vehiculo.numeroRuedas = sqlite3_column_int(sqlStatement,

    2);

    [listaVehiculos addObject:vehiculo];

    }

    return listaVehiculos;

    }

    Hemos creado el mtodo obtenerRutaBD el cual usaremos en la segunda parte del ejercicio, en el

    que realizaremos inserciones, modificaciones y borrados. El propsito de este mtodo es el de

    copiar al directorio de Documents del dispositivo el fichero .sqlite siempre y cuando ste no

    exista. Esto es debido a que no se puede escribir en ficheros que se encuentren en la raz de la

    aplicacin (main bundle) ya que es de slo lectura. Por otro lado, en el mtodo obtenerVehiculos

    podemos ver cmo se obtiene la ruta de nuestro fichero de base de datos, se abre la conexin, se

    prepara la sentencia y se lanza. Todo esto puede hacerse gracias a los mtodos sqlite3_open,

    sqlite3_prepare_v2 y sqlite3_step.

  • 25

    Ahora crearemos nuestro storyboard para poder gestionar todas estas operaciones. Primero de

    todo, aadiremos a nuestro storyboard un TableViewController. Una vez aadido, seleccionamos el

    controller y una vez hecho esto, abrimos el men Editor y seleccionamos la opcin Embed In ->

    Navigation Controller. Tambin aadiremos un ViewController al storyboard, y a este nuevo

    ViewController le aadimos dos UILabel y dos UITextField y le ponemos como identificador el

    nombre visualizacin, quedando finalmente nuestro storyboard tal y como muestra la siguiente

    imagen:

    Tambin seleccionamos la celda del TableViewController y le ponemos como identificador el

    nombre celda.

    Ahora vamos a centrarnos en mostrar datos en el TableViewController. Lo primero que haremos

    ser crear una nueva clase que sea una subclase de UITableViewController, la

    llamaremos ListaVehiculosViewController y en nuestro storyboard se la asignaremos al

    TableViewController. En esta nueva clase definiremos un objeto de tipo VehiculoDAO y otro de

    tipo NSMutableArray. En el mtodo viewDidLoad inicializaremos estos dos objetos y, una vez

    inicializados, lanzaremos una consulta para que nos devuelva todos los vehculos de nuestra tabla

    con este cdigo:

    ListaVehiculosViewController.h

    #import

    #import "VehiculoDAO.h"

    @interface ListaVehiculosViewController : UITableViewController{

    VehiculoDAO *dao;

    NSMutableArray *vehiculos;

    }

    @property (nonatomic, strong) VehiculoDAO *dao;

    @property (nonatomic, strong) NSMutableArray *vehiculos;

    @end

    ListaVehiculosViewController.m

  • 26

    @synthesize dao;

    @synthesize vehiculos;

    - (void)viewDidLoad

    {

    dao = [[VehiculoDAO alloc] init];

    vehiculos = [[NSMutableArray alloc] init];

    vehiculos = [dao obtenerVehiculos];

    [super viewDidLoad];

    }

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    {

    return 1;

    }

    - (NSInteger)tableView:(UITableView *)tableView

    numberOfRowsInSection:(NSInteger)section

    {

    return [vehiculos count];

    }

    - (UITableViewCell *)tableView:(UITableView *)tableView

    cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

    static NSString *CellIdentifier = @"celda";

    UITableViewCell *cell = [tableView

    dequeueReusableCellWithIdentifier:CellIdentifier];

    cell.textLabel.text = [[vehiculos objectAtIndex:[indexPath row]]

    valueForKey:@"nombreVehiculo"];

    return cell;

    }

    - (void)tableView:(UITableView *)tableView

    didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    {

    ModVehiculoViewController *destino = [self.storyboard

    instantiateViewControllerWithIdentifier:@"visualizacion"];

    Vehiculo *tmp = [vehiculos objectAtIndex:[indexPath row]];

    destino.vehiculo = tmp;

    [self.navigationController pushViewController:destino animated:YES];

    }

    Como podemos ver en el cdigo, le indicaremos que slo tendr una seccin y el nmero de filas

    ser el tamao del array que nos devuelva la consulta. Tambin hemos implementado el mtodo

    didSelectRowAtIndexPath para hacer la transicin desde la celda hasta el ViewController que nos

    ensear los datos del vehculo.

  • 27

    Por ltimo, nos centraremos en el ViewController de destino. Para ello, vamos a aprovecharnos de

    la clase ViewController que se crea por defecto cuando creamos el proyecto. Primero de todo, la

    renombramos a ModVehiculoViewController y se la asignamos en el storyboard al ViewController.

    Una vez hecho esto, en la clase definiremos los IBOutlet necesarios, un objeto de

    tipo VehiculoDAO y otro objeto de tipo Vehiculo. Por ltimo, definiremos tambin un mtodo para

    ocultar el teclado. La clase quedar como puede verse en el siguiente cdigo:

    ModVehiculoViewController.h

    #import

    #import "VehiculoDAO.h"

    #import "Vehiculo.h"

    @interface ModVehiculoViewController : UIViewController{

    IBOutlet UILabel *etqNombre;

    IBOutlet UILabel *etqRuedas;

    IBOutlet UITextField *txtNombre;

    IBOutlet UITextField *txtRuedas;

    VehiculoDAO *dao;

    Vehiculo *vehiculo;

    }

    @property (nonatomic, strong) IBOutlet UILabel *etqNombre;

    @property (nonatomic, strong) IBOutlet UILabel *etqRuedas;

    @property (nonatomic, strong) IBOutlet UITextField *txtNombre;

    @property (nonatomic, strong) IBOutlet UITextField *txtRuedas;

    @property (nonatomic, strong) Vehiculo *vehiculo;

    @property (nonatomic, strong) VehiculoDAO *dao;

    - (IBAction) ocultarTeclado:(id)sender;

    @end

    ModVehiculoViewController.m

    @synthesize etqNombre;

    @synthesize etqRuedas;

    @synthesize txtNombre;

    @synthesize txtRuedas;

    @synthesize dao;

    @synthesize vehiculo;

    -(void) touchesBegan :(NSSet *) touches withEvent:(UIEvent *)event{

    [txtNombre resignFirstResponder];

    [txtRuedas resignFirstResponder];

    [super touchesBegan:touches withEvent:event ];

    }

    - (IBAction)ocultarTeclado:(id)sender{

    }

    - (void)viewDidLoad

    {

    [txtNombre setText:vehiculo.nombreVehiculo];

  • 28

    [txtRuedas setText:[NSString stringWithFormat:@"%d",

    vehiculo.numeroRuedas]];

    [txtRuedas setKeyboardType:UIKeyboardTypeNumberPad];

    dao = [[VehiculoDAO alloc] init];

    [super viewDidLoad];

    }

    Y con esto ya tenemos la primera parte del ejercicio. Bastar con ejecutar el simulador para ver el

    resultado:

  • 29

    Ahora vamos a hacer va completar la clase VehiculoDAO aadindole los mtodos necesarios

    para realizar el resto de operaciones. El cdigo fuente a aadir es el siguiente:

    VehiculoDAO.h

    - (void) crearVehiculo: (NSString *)nombre ruedas:(NSInteger) ruedas;

    - (void) actualizarVehiculo: (NSInteger) vehiculoID nombre:(NSString

    *)nombre ruedas:(NSInteger) ruedas;

    - (void) borrarVehiculo: (NSInteger) vehiculoID;

    VehiculoDAO.m

    - (void) crearVehiculo:(NSString *)nombre ruedas:(NSInteger)ruedas{

    NSString *ubicacionDB = [self obtenerRutaBD];

    if(!(sqlite3_open([ubicacionDB UTF8String], &bd) == SQLITE_OK)){

    NSLog(@"No se puede conectar con la BD");

    return;

    } else {

    NSString *sqlInsert = [NSString stringWithFormat:@"INSERT INTO

    vehiculo (nombre_vehiculo, numero_ruedas) VALUES ('%@', %d)", nombre,

    ruedas];

    const char *sql = [sqlInsert UTF8String];

    sqlite3_stmt *sqlStatement;

    if(sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) !=

    SQLITE_OK){

    NSLog(@"Problema al preparar el statement");

    return;

    } else {

    if(sqlite3_step(sqlStatement) == SQLITE_DONE){

    sqlite3_finalize(sqlStatement);

    sqlite3_close(bd);

    }

    }

    }

    }

    - (void) actualizarVehiculo:(NSInteger) vehiculoID nombre:(NSString

    *)nombre ruedas:(NSInteger)ruedas{

    NSString *ubicacionBD = [self obtenerRutaBD];

    if(!(sqlite3_open([ubicacionBD UTF8String], &bd) == SQLITE_OK)){

    NSLog(@"No se puede conectar con la BD");

    return;

    } else {

    NSString *sqlUpdate = [NSString stringWithFormat:@"UPDATE vehiculo

    SET nombre_vehiculo = '%@', numero_ruedas = %d WHERE id = %d", nombre,

    ruedas, vehiculoID];

    const char *sql = [sqlUpdate UTF8String];

    sqlite3_stmt *sqlStatement;

    if(sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) !=

    SQLITE_OK){

    NSLog(@"Problema al preparar el statement.");

    return;

    } else {

  • 30

    if(sqlite3_step(sqlStatement) == SQLITE_DONE){

    sqlite3_finalize(sqlStatement);

    sqlite3_close(bd);

    }

    }

    }

    }

    - (void) borrarVehiculo:(NSInteger) vehiculoID{

    NSString *ubicacionBD = [self obtenerRutaBD];

    if(!(sqlite3_open([ubicacionBD UTF8String], &bd) == SQLITE_OK)){

    NSLog(@"No se puede conectar con la BD");

    return;

    } else {

    NSString *sqlDelete = [NSString stringWithFormat:@"DELETE FROM

    vehiculo WHERE id = %d", vehiculoID];

    const char *sql = [sqlDelete UTF8String];

    sqlite3_stmt *sqlStatement;

    if(sqlite3_prepare_v2(bd, sql, -1, &sqlStatement, NULL) !=

    SQLITE_OK){

    NSLog(@"Problema al preparar el statement.");

    return;

    } else {

    if(sqlite3_step(sqlStatement) == SQLITE_DONE){

    sqlite3_finalize(sqlStatement);

    sqlite3_close(bd);

    }

    }

    }

    }

    Como podemos ver, en estos mtodos se hacen prcticamente los mismos pasos que en el

    mtodo de consulta, lo nico que cambia es qu sentencia SQL se lanza y el procesamiento final.

    Ahora vamos a dirigirnos al storyboard y aadiremos un nuevo ViewController. A este

    ViewController le aadiremos dos UILabel, dos UITextField y un UIButton. El ViewController

    deber quedar as:

  • 31

    A continuacin vamos a crear una nueva clase en nuestro proyecto y la llamaremos

    AltaVehiculoViewController y se la asignamos en el storyboard a este nuevo ViewController. Una

    vez renombrada, definimos los IBOutlet necesarios y definimos el IBAction correspondiente al alta

    de un nuevo elemento. Tambin definiremos un objeto de tipo VehiculoDAO, el cual nos

    permitir conectar con la base de datos y lanzar las operaciones necesarias. En el mtodo

    viewDidLoad inicializaremos el dao y ya estar listo para utilizarse. Ahora slo queda programar el

    proceso de alta y ste es el cdigo que nos permitir hacerlo:

    AltaVehiculoViewController.h

    #import

    #import "VehiculoDAO.h"

    @interface AltaVehiculoViewController : UIViewController{

    IBOutlet UILabel *etqNombre;

    IBOutlet UILabel *etqRuedas;

    IBOutlet UITextField *txtNombre;

    IBOutlet UITextField *txtRuedas;

    IBOutlet UIButton *btnCrear;

  • 32

    VehiculoDAO *dao;

    }

    @property (nonatomic, strong) IBOutlet UILabel *etqNombre;

    @property (nonatomic, strong) IBOutlet UILabel *etqRuedas;

    @property (nonatomic, strong) IBOutlet UITextField *txtNombre;

    @property (nonatomic, strong) IBOutlet UITextField *txtRuedas;

    @property (nonatomic, strong) IBOutlet UIButton *btnCrear;

    @property (nonatomic, strong) VehiculoDAO *dao;

    - (IBAction) ocultarTeclado:(id)sender;

    - (IBAction) crearNuevoVehiculo:(id)sender;

    @end

    AltaVehiculoViewController.m

    @synthesize etqNombre;

    @synthesize etqRuedas;

    @synthesize txtNombre;

    @synthesize txtRuedas;

    @synthesize btnCrear;

    @synthesize dao;

    -(void) touchesBegan :(NSSet *) touches withEvent:(UIEvent *)event{

    [txtNombre resignFirstResponder];

    [txtRuedas resignFirstResponder];

    [super touchesBegan:touches withEvent:event ];

    }

    - (void)viewDidLoad{

    dao = [[VehiculoDAO alloc] init];

    [txtRuedas setKeyboardType:UIKeyboardTypeNumberPad];

    [super viewDidLoad];

    }

    - (IBAction)ocultarTeclado:(id)sender{

    }

    - (IBAction) crearNuevoVehiculo:(id)sender{

    NSString *nombre = [NSString stringWithFormat:txtNombre.text];

    NSInteger ruedas = [txtRuedas.text integerValue];

    [dao crearVehiculo:nombre ruedas:ruedas];

    }

    Hacemos los enlaces correspondientes en el storyboard, acordndonos de asociar todos los

    mtodos (incluido el de ocultar el teclado) y ya tendremos lista esta clase. Nos volvemos a ir al

    storyboard y en el TableViewController aadiremos un botn del tipo Bar Button Item en la barra

    de navegacin. Uniremos este botn con el ViewController que acabamos de aadir mediante un

    segue de tipo Push. Para ello, seleccionamos el botn y, con la tecla Control apretada, arrastramos

  • 33

    el ratn hacia el controller de destino. En el men desplegable que aparece, seleccionamos Push y

    ya tendremos unidos el TableViewController y el ViewController de altas.

    Nos dirigimos al ViewController que utilizamos en la primera parte como detalle de datos y le

    aadiremos dos UIButton, uno para modificar y otro para borrar. Tambin hemos de editar la

    clase ModVehiculoViewController para aadirle estos dos botones y los dos nuevos mtodos,

    uno para borrar y otro para modificar un vehculo. Esto lo podemos ver en el siguiente cdigo:

    ModVehiculoViewController.h

    @interface ModVehiculoViewController : UIViewController{

    IBOutlet UIButton *btnModificar;

    IBOutlet UIButton *btnBorrar;

    }

    @property (nonatomic, strong) IBOutlet UIButton *btnModificar;

    @property (nonatomic, strong) IBOutlet UIButton *btnBorrar;

    - (IBAction) modificarVehiculo:(id)sender;

    - (IBAction) borrarVehiculo:(id)sender;

    ModVehiculoViewController.m

    @synthesize btnModificar;

    @synthesize btnBorrar;

    - (IBAction)modificarVehiculo:(id)sender{

    NSInteger vehiculoID = vehiculo.vehiculoID;

    NSString *nombre = txtNombre.text;

    NSInteger numRuedas = [txtRuedas.text integerValue];

    [dao actualizarVehiculo:vehiculoID nombre:nombre

    ruedas:numRuedas];

    }

    - (IBAction)borrarVehiculo:(id)sender{

    NSInteger vehiculoID = vehiculo.vehiculoID;

    [dao borrarVehiculo:vehiculoID];

    }

    Hacemos los enlaces correspondientes en el storyboard, incluyendo los actions que lanzar cada

    botn y con esto ya tendremos listo nuestro ViewController para modificar y borrar datos. Una vez

    hecho este montaje, el storyboard quedar as:

  • 34

    Una vez hechas todas estas acciones, ya tenemos lista nuestra aplicacin para hacer altas, bajas,

    modificaciones y consultas contra una base de datos SQLite. Para aportar ms informacin,

    podemos aadir una alerta cuando se haga cada operacin que suponga persistencia sobre la base

    de datos. Slo nos queda ejecutar el simulador para ver el resultado:

  • 35

    Multitouch, Tap, y Gestos

    Gestos, Taps y Touches

    Un reconocedor de gesto (gesture) es en realidad un objeto de la clase abstracta

    UIGestureRecognizer. Tal objeto se relaciona con una vista, y con monitores para gestos

    predefinidos que existen en la vista. Yendo un nivel ms profundo, se puede decir que los gestos

    son en realidad toques (touch) y movimientos de uno o ms dedos que suceden en un rea

    especfica de la pantalla, donde existe una vista. En las primeras versiones de iOS SDK, los

    reconocedores de gestos no fueron proporcionados a los desarrolladores, por lo que la aplicacin

    de esas formas de interaccin requiere mucho trabajo manual. Afortunadamente, Apple ha

    envuelto todo ese trabajo manual y se lo dio a los desarrolladores como una sola herramienta, y

    de esa manera el trabajo con gestos se convirti en una parte realmente fcil de la programacin

    iOS.

    La clase UIGestureRecognizer en resumen, no se puede utilizar directame nte. Hay subclases

    especficas que se proporcionan para su uso, y cada uno de ellos se ocupa para un tipo especfico

    de gesto. Vamos a revisar cada uno de ellos y sabremos que hace cada uno:

    UITapGestureRecognizer: Esta clase se refiere a los tap(golpecito) gestos realizados en una vista.

    Se puede utilizar para manejar simples o multiples taps, ya sea con uno o ms dedos. Tapping es

    uno de los gestos ms habituales que los usuarios hacen.

    UISwipeGestureRecognizer: Otro gesto importante es el swipe (golpe), y existe esta clase slo

    para l. Swiping sucede al arrastrar un dedo hacia una direccin (derecha, izquierda, arriba y

    abajo). Existe un ejemplo caracterstico del gesto de deslizar en la aplicacin Fotos, donde

    utilizamos nuestros dedos a deslizarse de una foto a otra.

    UIPanGestureRecognizer: El gesto pan es en realidad un gesto de arrastrar. Se utiliza cuando es

    necesario para arrastrar vistas desde un punto a otro.

    UIPinchGestureRecognizer: Al ver las fotos en la aplicacin Fotos y utiliza sus dos dedos para

    acercar o alejar a una foto, esto es realizar un gesto de pellizco. Como ustedes comprendern,

    pellizcos requiere dos dedos. Un objeto de esta clase es generalmente til para cambiar la

    transformacin de una vista, y ms especficamente su escala. Usando gestos de pellizco por

    ejemplo, se puede aplicar el zoom dentro y fuera de las fotos en sus propias aplicaciones.

    UIRotationGestureRecognizer: De acuerdo con el gesto anterior, la rotacin se utiliza para girar

    una vista usando dos dedos.

  • 36

    UILongPressGestureRecognizer: Una clase que monitorea un gesto de prensa que tarda mucho en

    una vista. El prensado debe durar lo suficiente para ser detectado, y el dedo o dedos no deben

    moverse mucho alrededor del punto pulsado de lo contrario el gesto falla.

    UIScreenEdgePanGestureRecognizer: ste es similar al gesto de golpe, pero con una gran

    diferencia: el movimiento de los dedos debe comenzar siempre desde un borde de la pantalla.

    Todos los objetos de tipo gesto realizan una accin una vez que se detecta un gesto vlido. Este

    puede ser en un mtodo IBAction en caso de que se aada el gesto a travs de la Interface Builder,

    o un mtodo privado o pblico en caso de implementacin programtica. Cuando se llama a una

    accin de un mtodo despus de que un gesto ha sucedido, el objeto gesto siempre enva a s

    mismo informacin adicional que se requiere cuando se manipule el gesto. Algunas de las

    siguientes firmas de los mtodos son vlidos:

    -(void)handleMyTapGesture;

    -(void)handleMyTapGestureWithGestureRecognizer:(UITapGestureRecognizer

    *)gestureRecognizer;

    En el segundo caso, el argumento gestureRecognizer le puede proporcionar informacin adicional

    que pueda necesitar, como en qu lugar se ejecuto el gesto.

    Mirando ahora desde otro punto, una vista puede contener ms de un reconocedor de gesto. Por

    ejemplo, puede agregar dos reconocedores de pellizco y gesto de rotacin a un imageview, por lo

    que se puede hacer zoom in / out y girar la imagen presentada. Sin embargo, puede ocurrir un

    solo gesto en un momento dado. Los Reconocedores de Gesto que estn relacionados con una

    vista se aaden a una matriz, para que puedan acceder a ellos como lo hara para cualquier objeto

    a una matriz normal.

  • 37

    Crear una aplicacin con Gestos.

    Vamos a comenzar por la creacin de un nuevo proyecto en Xcode. Seleccionaremos una

    aplicacin por pestaas(Tabs) como plantilla para el proyecto.

    A continuacin, estableceremos como nombre GesturesDemo como al proyecto, y asegurarnos de

    que este seleccionado iPhone como dispositivo

  • 38

    .

    Seleccionaremos el directorio donde se almacenar el proyecto y es todo.

    Ahora que el proyecto est listo, vamos a configurar la interfaz con la que trabajaremos mas tarde

    para el reconocimiento de gestos. De clic sobre el archivo Main.storyboard, y con ello aparecer la

    diseador de interfaz (Interface Builder). Como se observa, hay dos controladores de vista

    conectados al controlador barra de pestaas, as que tenemos que aadir tres ms. Desde la

    biblioteca de objetos, arrastre y suelte tres nuevos objetos View Controller al canvas IB.

    Antes de conectamos a los controladores de vista de la barra de pestaas, debemos crear las clases

    de controlador necesarias. Comencemos por seleccionar las clases FirstViewController y

    SecondViewController (tanto el .h y archivos .m) en el Navegador de proyectos, y luego pulsa la

    tecla Supr del teclado. No vamos a utilizar estos archivos, vamos a crear nuevas clases para los

    reconocedores de gesto que vamos a trabajar.

  • 39

    En el cuadro de dilogo de confirmacin que aparece, haga clic en el botn Mover a la Papelera.

    A continuacin, aadimos las nuevas clases al proyecto. El procedimiento que se presenta se debe

    repetir cinco veces en total, hasta que todas las clases necesarias se hayan aadido al proyecto.

    Vamos a ver los detalles de la primera:

    Abra el men File> New> File ... y seleccione crear una nueva clase de Objective-C.

  • 40

    Da clic en Next y en el campo Subclass, asegrate que este seleccionado el valor UIViewController.

    En seguida coloca el nombre a la clase TapViewController en el campo clase

  • 41

    Procede al ltimo paso, y haz clic en el botn Crear para poder terminar con el asistente y dejar

    que Xcode cre y agregue la nueva clase al proyecto.

    Generar los siguientes controladores con los siguientes nombres de las clases:

    SwipeViewController

    PanViewController

    PinchViewController

    RotationViewController

    Despus de haber agregado todos ellos, as es como el Navegador de proyectos debe aparecer:

    Ahora podemos volver al Interface Builder. En primer lugar, asegrese de que el panel Utili ties

    est activo, ya que lo necesitar. A continuacin, seleccione el primer view controller creado

    (vamos a empezar desde arriba hacia abajo), y se muestra el Inspector de identidad(Identity

    Inspector) en el panel de Utilidades. All, en el campo Clase de la seccin de clase personalizada,

    defina el nombre de la primera clase que ha aadido al proyecto, el * TapViewController:

  • 42

    Repita el paso anterior hasta que establezca todas las clases personalizadas a los controladores de

    vista restantes.

    Nuestro prximo paso es conectar todos los controladores de vista al controlador de la barra de

    pestaas. Esto se puede hacer muy fcilmente, si se selecciona el controlador de la barra de

    pestaas y luego se abre el Inspector Conexiones en el panel Utilidades. La seccin Segues Se

    activa, haga clic en el crculo de la derecha de la opcin de los controladores de vista y arrastre en

    la parte superior de cada controlador de vista que no est conectado, y proceder al conectarlos

    uno por uno.

  • 43

    Una vez que se han realizado todas las conexiones, puede establecer los ttulos de los elementos

    de los botones de barras de los controladores de vista. Empieza de la parte superior a la inferior,

    seleccione el elemento de la barra de pestaas y abra el inspector de atributos en el panel de

    Utilidades. All, establezca el ttulo propiamente para cada controlador de vista, y establecer la

    primera como la imagen de todos los controladores de vista.

  • 44

    Los ttulos de los elementos de la barra de pestaas debe estar en el siguiente orden:

    Tap

    Swipe

    Pan

    Pinch

    Rotation

    Por ltimo, eliminar el contenido existente en los dos primeros controladores de vista pre -hechos.

    Todo est listo ahora. Opcionalmente, se puede aadir una etiqueta como un ttulo para cada

    controlador de vista. Si te gustara hacer eso tambin, a continuacin, arrastre un objeto UILabel a

    cada controlador de vista y establecer los siguientes atributos:

    Frame : X=20, Y=40, Width=280, Height=40

    Font: System Bold, 20pt

    Alignment: Center

    Los textos de las etiquetas deben ser (siguiendo el mismo orden que antes):

  • 45

    Tap Gesture

    Swipe Gesture

    Pan Gesture

    Pinch Gesture

    Rotation Gesture

    Ahora que tenemos la configuracin, podemos pasar directamente al corazn de nuestro tema.

    Sin embargo, vamos a regresar varias veces aqu al Interface Builder con el objetivo de crear los

    puntos de vista de las pruebas necesarias para cada reconocedor de gesto.

    Detectar Gestos dentro de la pantalla

    Empezamos la exploracin real del tema con el tap gesture recognizer. En la parte anterior, se ha

    aadido todos los controladores de vista necesarios para el proyecto y estn conectados con el

    controlador de la barra de pestaas. Ahora, en esta parte, vamos a aadir un objeto de vista

    (UIView) al controlador de vista Tap, que usaremos como una vista de prueba con el fin de hacer

    nuestro trabajo en el cdigo.

  • 46

    En primer lugar, asegrese de que usted tiene el Interface Builder todava haciendo clic en el

    archivo Main.storyboard en el Navegador de proyectos. A continuacin, llevar la escena del

    controlador de vista al Tap View Controller, y luego seleccionar un objeto UIView de la Biblioteca

    de objetos y arrastrarlo a la vista. Establezca las siguientes propiedades:

    Frame : X=110, Y=234, Width=100, Height=100

    Background Color: R=215, G=116, B=52

    Ahora que la vista est en su lugar, tenemos que crear una propiedad IBOutlet y conectarlo con la

    vista. Abra el archivo TapViewController.h y declarar la siguiente propiedad:

    @interface TapViewController : UIViewController @property (weak, nonatomic) IBOutlet UIView *testView;

    @end

    Regrese al archivo Main.storyboard de nuevo, vaya al panel Esquema del documento, y Ctrl -

    Arrastre desde el punto de vista Toque escena controlador de objeto a la vista, como se muestra a

    continuacin:

  • 47

    En la ventana emergente, slo tienes que seleccionar la propiedad TestView, y ya est todo.

  • 48

    Nota: Nosotros vamos a utilizar el procedimiento anterior para aadir objetos de prueba y para

    conectarlos con propiedades IBOutlet.

    Ahora, abra el archivo TapViewController.m. Lo primero que debemos hacer, es crear un objeto de

    la clase UITapGestureRecognizer, que luego aadiremos a la vista TestView. En realidad, vamos a

    crear dos objetos de esa clase, uno para pruebas de taps individuales, y uno para probar dobles

    taps. Nuestro trabajo se llevar a cabo inicialmente con el mtodo viewDidLoad, as que vamos a

    empezar con la primera.

    El siguiente segmento de cdigo muestra claramente cmo inicializamos un objeto gesto

    reconocedor:

    UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)];

    Al usarlo de esta forma, se puede inicializar cualquier objeto de las subclases del gesture, siempre

    y cuando se sustituye el nombre de la clase. Como ves, especificamos un objetivo y una acci n. La

    accin en este caso es un mtodo privado que estamos a punto de crear.

    Para asignar el gesto anterior al test view, esto es lo que debemos escribir:

    [self.testView addGestureRecognizer:singleTapGestureRecognizer];

    El addGestureRecognizer: es l nico mtodo para aadir un objeto de tipo gesto a una vista.

    Ve ahora a la seccin privada de la interfaz, y para declarar el mtodo privado de la siguiente

    manera:

    @interface TapViewController () -(void)handleSingleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer;

    @end

    Como se menciono en la introduccin, el objeto reconocedor de gestos hace pasar al mtodo de

    seleccin, y mediante el uso de esta firma de mtodo se puede usar posteriormente en la

    aplicacin.

    Hacemos ms que el doble de la anchura de la vista de prueba cuando hacemos tapping en l una

    vez, y vamos a revertir el valor de la anchura original tras el segundo toque:

    -(void)handleSingleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer{ CGFloat newWidth = 100.0; if (self.testView.frame.size.width == 100.0) { newWidth = 200.0; } CGPoint currentCenter = self.testView.center;

  • 49

    self.testView.frame = CGRectMake(self.testView.frame.origin.x, self.testView.frame.origin.y, newWidth, self.testView.frame.size.height); self.testView.center = currentCenter;

    }

    Comprobamos si el ancho inicial de la vista es igual a 100,0 puntos, y si es as lo hacemos 200.0, si

    no mantenemos el valor asignado inicial (100,0). A continuacin, nos atenemos a una variable de

    estructura CGPoint el punto central actual, cambiamos el ancho de la vista y nos centramos de

    nuevo.

    Ahora es el momento de probar el tap del gesto. Ejecutar la aplicacin, y una vez que se puso en

    marcha ya sea al simulador o un dispositivo, asegrese de que usted est en la primera ficha. Pulse

    sobre la vista una vez, y su tamao va a cambiar. Toque una vez ms, y ver que volver a su estado

    original.

    Volvamos a nuestro trabajo de nuevo. Como se ha mencionado, un tap gesture se puede realizar

    con uno o ms dedos, y el gesto podra requerir uno o ms taps. As que, veremos un ejemplo ms,

    donde esta vez vamos a "decirle" al objeto reconocedor gesto que queremos dos taps que

  • 50

    sucedan, y que dos dedos se requieren para llevar a cabo la accin predefinida. En el mtodo

    viewDidLoad, agregue las siguientes:

    - (void)viewDidLoad { ... UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTapGesture:)]; doubleTapGestureRecognizer.numberOfTapsRequired = 2; doubleTapGestureRecognizer.numberOfTouchesRequired = 2; [self.testView addGestureRecognizer:doubleTapGestureRecognizer]; }

    Aqu inicializamos un objeto nuevo reconocedor de tap gesture y especificamos otro mtodo de

    accin que vamos a poner en prctica. Lo nuevo aqu es sin embargo el uso de las dos propiedades

    que nos permiten establecer el nmero de los grifos y toques necesarios (o en otras palabras, el

    nmero de dedos). Finalmente, aadimos el objeto reconocedor a la vista TestView.

    Tenga en cuenta que nuestra visin de prueba ahora contiene dos objetos gesto reconocedor.

    Ahora, vamos a poder terminar con las tareas pendientes. Vaya a la seccin inte rfaz privada y

    declarar el nuevo mtodo privado:

    @interface TapViewController ()

    ...

    -

    (void)handleDoubleTapGesture:(UITapGestureRecognizer *)tapGestureRecogni

    zer;

    @end

    En su definicin, vamos a cambiar la anchura y la altura de la vista al duplicar su tamao. Vamos a

    seguir la misma lgica que antes:

    -(void)handleDoubleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer{ CGSize newSize = CGSizeMake(100.0, 100.0); if (self.testView.frame.size.width == 100.0) { newSize.width = 200.0;

  • 51

    newSize.height = 200.0; } CGPoint currentCenter = self.testView.center; self.testView.frame = CGRectMake(self.testView.frame.origin.x, self.testView.frame.origin.y, newSize.width, newSize.height); self.testView.center = currentCenter; }

    Ejecutar la aplicacin una vez ms. Esta vez, tocar dos veces y usar dos dedos, de lo contrario el

    gesto fallar. Adems, trate tanto de los reconocedores gestos que hemos creado aqu:

  • 52

    Swipe Gesture Recognizer

    Otra reconocedor gesto bastante comn es el golpe. Swiping se puede hacer hacia cualquiera de

    las cuatro direcciones bsicas (derecha, izquierda, arriba, abajo), pero no en una forma diagonal.

    La clase UISwipeGestureRecongnizer proporciona un mtodo que nos permite especificar la

    direccin, y si no se establece, entonces la direccin correcta se utiliza por defecto. Un objeto

    reconocedor gesto de golpe puede supervisar y motivar acciones de una sola direccin. Eso

    significa que si quieres una vista en su aplicacin para apoyar a deslizar hacia dos o ms

    direcciones, a continuacin, debe crear dos o ms objetos gesto reconocedor respectivamente.

    Ms all de todo eso, tenga en cuenta que la accin que ha sido provocado por el movimiento de

    golpe comienza justo despus de la birlar ha terminado (cuando el dedo en realidad deja de

    deslizamiento).

    En esta parte vamos a trabajar con la clase SwipeViewController que previamente hemos aadido

    al proyecto. En la escena correspondiente en el Interface Builder, vamos a aadir tres visin

    (UIView) objetos. La anchura de las tres vistas ser igual a la anchura de la pantalla. El primer

    punto de vista se colocar en la pantalla, mientras que los otros dos puntos de vista sern

    colocados en el lado derecho de la primera vista de la izquierda y, y, obviamente, estar fuera de

    la zona visible. Nuestro objetivo es hacer que estas opiniones se mueven horizontalmente usando

    gestos banda magntica, y dejar que las opiniones ocultas sean revelados deslizando hacia la

    izquierda o derecha.

    Main.storyboard. Ir a la escena del controlador de vista Swipe y aadir los prximos tres

    subventanas definiendo al mismo tiempo las propiedades del marco y el color de fondo:

    Primer View

    Frame : X=0, Y=234, Width=320, Height=100

    Background Color: R=215, G=116, B=52

    Segundo View

    Frame: X=320, Y=234, Width=320, Height=100

    Background Color: Black Color

    Third View

    Frame: X=-320, Y=234, Width=320, Height=100

    Background Color: R=0, G=128, B=0

  • 53

    A continuacin, cree las siguientes propiedades IBOutlet al archivo SwipeViewController.h:

    @interface SwipeViewController : UIViewController

    @property (weak, nonatomic) IBOutlet UIView *viewOrange;

    @property (weak, nonatomic) IBOutlet UIView *viewBlack;

    @property (weak, nonatomic) IBOutlet UIView *viewGreen;

    @end

    Despus de haberlo hecho, volver a la escena del Swipe view controller, y hacer las conexiones

    adecuadas. Obviamente, la propiedad viewOrange coincide con el primer punto de vista, la

    propiedad viewBlack coincide con el segundo punto de vista, y la propiedad viewGreen coincide

    con el tercer punto de vista.

    Ahora, vamos a la cabeza en el fichero SwipeViewController.m, y vamos a empezar a crear el

    reconocedor gesto que necesitamos uno por uno. Ir al mtodo viewDidLoad, e inicializar un

  • 54

    objeto, por primera vista (el que est en el medio de estar en el rea visible de la pantalla). Vamos

    a ver que:

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UISwipeGestureRecognizer *swipeRightOrange = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToRightWithGestureRecognizer:)]; swipeRightOrange.direction = UISwipeGestureRecognizerDirectionRight; }

    Lo que hemos hecho con este segmento es muy claro: A la inicializacin de objetos especificamos

    el mtodo de accin que se debe llamar cuando ocurrir el birlar, y luego nos pusimos en la

    direccin del gesto de deslizar hacia la derecha.

    Ahora, vamos a crear una mayor gesto objeto reconocedor que nos permita deslizar hacia la

    izquierda:

    - (void)viewDidLoad { ... UISwipeGestureRecognizer *swipeLeftOrange = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToLeftWithGestureRecognizer:)]; swipeLeftOrange.direction = UISwipeGestureRecognizerDirectionLeft; }

    Ahora solo se aaden estos dos reconocedores gesto a la vista viewOrange exactamente como se

    muestra a continuacin:

    - (void)viewDidLoad { ... [self.viewOrange addGestureRecognizer:swipeRightOrange]; [self.viewOrange addGestureRecognizer:swipeLeftOrange]; }

  • 55

    Los mtodos de accin que se propusieron a los reconocedores de arriba, deben realizar una

    accin simple: Para deslizar todos los puntos de vista, ya sea hacia la izquierda o hacia la derecha,

    por lo que cuando una vista deja el rea visible de la pantalla, otro que se apareci. Vamos a

    declarar a ellos primero y vamos a hacer la aplicacin siguiente. En la seccin de interfaz privada

    aadir las siguientes lneas:

    @interface SwipeViewController () -(void)slideToRightWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer; -(void)slideToLeftWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer; @end

    Observaremos la aplicacin del primer mtodo de inmediato:

    -(void)slideToRightWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer{ [UIView animateWithDuration:0.5 animations:^{ self.viewOrange.frame = CGRectOffset(self.viewOrange.frame, 320.0, 0.0); self.viewBlack.frame = CGRectOffset(self.viewBlack.frame, 320.0, 0.0); self.viewGreen.frame = CGRectOffset(self.viewGreen.frame, 320.0, 0.0); }]; }

    Como se observa, cuando nos acercamos hacia la derecha, queremos que el punto de vista de

    cada origen X a incrementarse en 320,0 pxeles y manejar de esa manera para mover nuestros

    puntos de vista a la derecha. Hacemos este movimiento se vea natural simplemente envolviendo

    todo en un bloque de animacin. Ntese tambin que la velocidad de movimiento depende de la

    duracin de la animacin, as que si quieres un efecto ms lento diapositiva que debe aumentar la

    duracin de la animacin, mientras que si los necesita para avanzar ms rpido, a continuacin,

    slo disminuir la duracin.

    El segundo mtodo de accin va a ser similar a este, con una diferencia solamente: El

    desplazamiento en el eje X ser un nmero negativo (igual, por supuesto, a 320,0 pxeles), as que

    las vistas se mueve hacia la izquierda. Veamos esta aplicacin, as:

    -(void)slideToLeftWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer{ [UIView animateWithDuration:0.5 animations:^{

  • 56

    self.viewOrange.frame = CGRectOffset(self.viewOrange.frame, -320.0, 0.0); self.viewBlack.frame = CGRectOffset(self.viewBlack.frame, -320.0, 0.0); self.viewGreen.frame = CGRectOffset(self.viewGreen.frame, -320.0, 0.0); }]; }

    Ejecutar la aplicacin una vez ms, y esta vez mostrar el contenido de la segunda pestaa. Deslice

    el dedo hacia la derecha o hacia la izquierda, y ver los puntos de vista se deslizan dentro y fuera

    usando una manera animada. Sin embargo, cuando una nueva vista aparece en pantalla, se

    observara que ningn gesto de deslizar funciona ms. Esto sucede por el hecho de que no se ha

    creado y aadido reconocedores gesto de golpe a los otros dos puntos de vista.

    Volver al mtodo viewDidLoad, y empezar aadiendo el siguiente segmento:

    - (void)viewDidLoad { ... UISwipeGestureRecognizer *swipeRightBlack = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToRightWithGestureRecognizer:)]; swipeRightBlack.direction = UISwipeGestureRecognizerDirectionRight; [self.viewBlack addGestureRecognizer:swipeRightBlack]; }

    Los mtodos de accin que se postulo a los reconocedores de arriba, deben realizar una cosa

    simple: Para deslizar todos los puntos de vista, ya sea hacia la izquierda o hacia la derecha, por lo

    que cuando una vista deja el rea visible de la pantalla, otro que se apareci. Vamos a declarar a

    ellos primero y vamos a hacer la aplicacin siguiente. En la seccin de interfaz privada aadir las

    siguientes lneas:

    - (void)viewDidLoad { ... UISwipeGestureRecognizer *swipeLeftGreen = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToLeftWithGestureRecognizer:)]; swipeLeftGreen.direction = UISwipeGestureRecognizerDirectionLeft; [self.viewGreen addGestureRecognizer:swipeLeftGreen]; }

  • 57

  • 58

  • 59

    Tenga en cuenta que por cada gesto de deslizar desea apoyarnos, debe crear un nuevo objeto

    gesto reconocedor. Creacin de un solo objeto y agregarlo a ms de un punto de vista no se va a

    trabajar. Si realmente quieres una prueba de ello, slo tiene que ir con el mtodo viewDidLoad y

    aadir el swipeRightOrange y los reconocedores gesto swipeLeftOrange a las otras dos vistas

    respectivamente. Ejecutar la aplicacin de nuevo, y luego pasar el dedo (o con el ratn en

    simulador) al igual que antes. Por desgracia, esta vez no va a funcionar, as que ponga todo de

    nuevo a su estado original.

    Pan Gesture Recognizer

    Este gesto es til cuando se desea permitir a sus usuarios arrastrar puntos de vista alrededor de la

    pantalla. En esta parte, a excepcin de la aplicacin del cdigo necesario que permitir a nuestra

    aplicacin para apoyar el gesto pan, nos encontraremos con un mtodo especial de la clase

  • 60

    UIPanGestureRecognizer, llamado velocityInView :. Este mtodo devuelve un valor CGPoint, y nos

    informa sobre la cantidad de puntos por segundo la vista arrastrado viaja tanto en el eje horizontal

    y vertical mientras arrastra. Esta informacin podra ser til en algunos casos, as que veremos

    cmo acceder a ella.

    Al igual que antes, vamos a empezar por la adicin de una vista de prueba para el Interface

    Builder. Ir al archivo Main.storyboard, a continuacin, arrastre un objeto de vista (UIView) a la

    escena del controlador de vista Pan. Establezca los siguientes dos atributos de la misma:

    Frame : X=110, Y=234, Width=100, Height=100

    Background Color: R=215, G=116, B=52 (o cualquier otro color)

    A continuacin, vaya al archivo PanViewController.h y declarar una propiedad IBOutlet que usted

    va despus de conectar a la vista:

    @interface PanViewController : UIViewController @property (weak, nonatomic) IBOutlet UIView *testView; @end

    Volver al archivo Main.storyboard y conecte la propiedad IBOutlet a la vista.

    Una vez que haya terminado de trabajar con el Interface Builder, haga clic en el archivo

    PanViewController.m en el Navegador de proyectos. El primer paso que debemos hacer, es crear

    un gesto de reconocimiento de la cacerola y aadirlo a nuestra visin de prueba.A continuacin

    vamos a ver es el siguiente:

    - (void)viewDidLoad { ... UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveViewWithGestureRecognizer:)]; [self.testView addGestureRecognizer:panGestureRecognizer]; }

    Ahora, declararemos e implementara el mtodo que establecimos como la accin que se debe

    tomar cuando el gesto pan va a suceder. En la seccin de interfaz privada, aadir lo siguiente:

    @interface PanViewController () -(void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureR

  • 61

    ecognizer; @end

    Anteriormente, el objetivo es arrastrar la vista de prueba mientras movemos el dedo en la

    pantalla. El enfoque ms fcil de que sera actualizar el punto de centro de la vista, siempre y

    cuando se produce la panoramizacin.La traduccin de este cdigo es la siguiente:

    -(void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer{ CGPoint touchLocation = [panGestureRecognizer locationInView:self.view]; self.testView.center = touchLocation; }

    Cada gesto reconocedor contiene un mtodo llamado locationInView. Este mtodo devuelve un

    valor CGPoint que representa el punto de la opinin de que el usuario afectado. En nuestro caso,

    llamando a este mtodo logramos obtener el punto tocado durante el arrastre, y para que nuestra

    aplicacin consciente del movimiento del dedo. Por lo tanto, lo que slo necesitamos es establecer

    esa ubicacin tctil como el valor para el punto central de la vista de la prueba, y eso es

    exactamente realizo utilizando el segundo comando anterior.

    Ejecutar la aplicacin ahora y coloque el dedo o el puntero del ratn en la vista de prue ba. Luego

    empiece a arrastrar alrededor y observe cmo la vista sigue el movimiento que realice.

  • 62

    El enfoque que present anteriormente es simple para el bien del tutorial. En una aplicacin real,

    es posible que desee enriquecer el movimiento de la vista mediante la adicin de aceleracin o

    deceleracin cuando empieza o deja arrastrar, o cualquier otra cosa que usted necesita. Todo

    depende de usted para aplicar la lgica propia en el mtodo de accin a implementar.

    Al comienzo de esta seccin, he dicho que no es un mtodo especial de la clase

    UIPanGestureRecognizer llamado velocityInView. Hasta este punto hemos totalmente ignorado,

    pero ahora vamos a ver cmo podemos acceder a ella y obtener los datos que proporciona. En

    aras de la demo, vuelva a la Interface Builder, haga clic en el archivo Main.storyboard. Localice la

    escena controlador de vista Pan, y aadir dos etiquetas con los siguientes atributos:

    Label #1

  • 63

    Frame: X=20, Y=445, Width=280, Height=21

    Text: Nothing (vacio)

    Font size: 14pt

    L