Curso de iOS7: Navigation Controller , Segues (II)

Esta es la segunda parte del tema de Navigation Controller.  Una vez que tenemos la pantalla de Añadir y la de Listado es necesario añadir una nueva escena de detalle. Realizamos el mismo proceso que hicimos con la escena de añadir.
Agregamos un nuevo botón a la barra de navegación pero esta vez lo colocamos a la izquierda del título:

Colocamos un nuevo view controller en el storyboard:
Y conectamos el botón de detalle con el nuevo View Controller mediante un segue de tipo push:
Y como vemos en la captura ya tenemos enlazado el detalle.
Repetimos el mismo proceso con la escena de Editar, pero esta vez la enlazamos desde un botón colocado en la escena de Detalle. Por lo que el storyboard debería quedar más o menos así.
Como podemos ver tenemos prácticamente todas las pantallas referentes a la aplicación.

Forzar la vuelta en la Navegación

Ahora tendríamos que gestionar los formularios correspondientes al Añadir y al Editar. Por la simplificación de la explicación nos centraremos en la gestión de la información correspondientes a los segues.
En las pantallas de los formularios es normal que al pulsar el botón de guardar volvamos a la anterior pantalla. Intentaremos realizar que mediante código, o programáticamente,  realizar esa vuelta a la anterior pantalla.
Vemos cómo se haría en el ejemplo
En la pantalla del Añadir colocamos un botón que nos permita guardar:
Relacionamos la acción del Touch Up Inside del botón con un método IBAction, tal como vimos anteriormente:
  • Creamos una nueva clase que herede de UIViewController, llamada por ejemplo, AnadirViewController
  • Asignamos esa clase como Custom Class de la escena del Añadir
  • Dividimos el Editor, dejando a la derecha el fichero de cabecera de la clase
  • Arrastramos con el control pulsado desde el botón al código
  • Seleccionamos Action
  • Escribimos el nombre del método, por ejemplo, guardar
  • y Pulsamos en Connect
Por lo que tendremos un método similar a este en la implementación:
– (IBAction)guardar:(id)sender {
}
Ahora tenemos dos opciones:
  • Volver a la anterior escena
  • Volver a la escena principal (Root View Controller)
En el primer caso deberemos hacer uso del método popViewControllerAnimated , el método quedaría de la siguiente manera:
– (IBAction)guardar:(id)sender {
        //volver a la anterior escena
        [self.navigationController popViewControllerAnimated:YES];
}
En el segundo caso utilizaremos el método popToRootViewControllerAnimated y el método quedaría así:
– (IBAction)guardar:(id)sender {
    //volver a la primera escena después del Navigation Controller o el Root View Controller
    [self.navigationController popToRootViewControllerAnimated:YES];
}

Pasar datos entre Escenas mediante Segues

Ahora es Cuando debemos pasar información entre escenas. Imaginemos la aplicación que estamos haciendo. En la escena de detalle debemos presentar datos que deben de ser pasados desde la vista del listado. El salto entre escenas lo estamos haciendo mediante un segue de tipo push.
Veamos un detalle del inspector de atributos del segue en cuestión:

Como se puede ver en la captura le hemos colocado un identificador al Segue, de esta manera desde la programación podemos realizar acciones antes de que se realice el salto a la nueva escena, mediante el método prepareForSegue.

Antes de colocar el método debemos asegurarnos que tanto la escena del listado como la del detalle tienen asignada una clase, mediante el Custom Class.

Ahora debemos asegurarnos que la clase del detalle dispone de una propiedad que nos permita pasar el dato que necesitamos, por simplicidad incluiremos un NSString, que luego utilizaremos para presentarlo en una Label.

Por lo que incluiremos en la escena del detalle una Label, y la enlazaremos con una propiedad IBOutlet en la cabecera de la clase de detalle.

También incluiremos la propiedad NSString, por lo que el fichero de cabecera de la clase de Detalle quedará de la siguiente manera:

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

@property (nonatomic, strong) NSString *cadena;

Ahora ya podemos incluir el método en la implementación en la clase del listado. como necesitamos hacer uso de la clase del Detalle deberemos importar la clase:

#import “DVDetalleViewController.h”

y ahora podemos implementar el método:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    NSLog(@”prepareForSegue: %@”, segue.identifier);
    if([segue.identifier isEqualToString:@”Detalle”])
    {
        DVDetalleViewController *detalleVC = segue.destinationViewController;
        detalleVC.cadena = @”Datos traspadados”;
    }

 

}

Como podemos ver en los parámetros nos pasan tanto el segue como el elemento que ha disparado el salto, en este caso el botón que pulsamos para realizar el salto.
Fijémonos en la primera linea:
NSLog(@”prepareForSegue: %@”, segue.identifier);
El identificador del segue está disponible como una propiedad de la clase, llamado identifier de esta manera podemos distinguir unos segues de otros dentro de una misma escena. Así si realizamos más de un salto desde una misma escena podemos filtrar entre ellos. Después tenemos el if donde nos aseguramos que estamos trabajando con el segue correcto que nos lleva a la escena del detalle. Y acto seguido recuperamos un objeto de la vista de detalle mediante el método destinationViewController . Con esto tenemos la instancia del objeto de la escena de destino y luego podemos modificar la propiedad cadena, que utilizaremos para almacenar el valor que necesitamos traspasar de una escena a otra.

Por otra parte en el DetalleViewController necesitaremos modificar el método viewDidLoad para hacer que según se cargue la vista ponga el dato en la etiqueta que añadimos anteriormente:

– (void)viewDidLoad
{
    [super viewDidLoad];
    etiqueta.text=cadena;

 

}

De esta manera al ejecutar la aplicación y pulsar en el botón del listado tendremos la escena de detalle pero en la etiqueta tendrá el texto traspasado:

 

Forzar un salto en la Navegación programáticamente

Una de las necesidades en la programación es que dependiendo de determinadas condiciones debemos realizar un salto entre escenas desde código.  Para ello deberemos utilizar el método  pushViewController del atributo navigationController del View Controller que estemos manejando con la navegación.
Vemos un ejemplo de código:
DVDetalleViewController *detalleVC = [self.storyboard instantiateViewControllerWithIdentifier:@”Detalle”];
    [self.navigationController pushViewController:vc animated:YES];
Como podemos ver en el ejemplo podemos inicializar nosotros el View Controller de destino utilizando el identificador de la escena del storyboard como parámetro y forzamos el salto push.

 

Licencia Creative Commons

Curso de iOS7: Navigation Controller, Segues (I)

La mayor parte de las aplicaciones iOS disponen de varias escenas. Por lo que necesitamos mecanismos que nos permitan navegar entre esas escenas. Una de las maneras de realizar estos cambios entre escenas es el Navigation Controller (UINavigationController):

Para poder hacer uso de este componente, vamos a tener en mente una aplicación CRUD. Es decir una aplicación que sea capaz de realizar las típicas acciones de la gestión de datos. Es decir:

  • Listar: En este caso por simplificar el ejemplo utilizaremos una sola label que pretenderá ser el listado de datos y par de botones que nos lleven a otras escenas.
  • Añadir: la escena que permite añadir nuevos elementos, por lo tanto un formulario con un botón de guardar.
  • Detalle: escena que permite la visualización de la información de un elemento.
  • Editar: Escena que permite editar un elemento, un formulario con los datos.
  • Borrar: esta acción deberá borrar un elemento, en este ejemplo estará localizada en el detalle.
Para poder seguir el ejemplo crearemos un nuevo proyecto de single view application.
Donde en el storyboard veremos esa escena:

Seleccionamos el view controller de la escena y lo borramos pulsando el botón de Borrar atrás. Por lo que nos quedará una storyboard vacío.

A continuación arrastramos el Navigation Controller al Storyboard, nos deberíamos encontrar con algo parecido a esto:

Como podemos ver tenemos dos nuevas escenas en el storyboard. La primera es la correspondiente al Navigation Controller y está así seleccionada con la flecha inicial.
Si seleccionamos sólo el Navigation Controller podemos ver en la vista de Atributos lo siguiente:

Especialmente importantes son las dos secciones de esta captura. Primero vemos el apartado del Navigation Controller, que nos permitirá configurar si es visible o no la Barra de Navegación. Y por otro lado el Initial Scene, que está marcado, por lo que el la escena del Navigation Controller será la primera escena de la App.

Por otro lado vemos también que tenemos una segunda escena con un Table View Controller ya incorporado:

Como podemos ver en la captura nos indica que es el Root View Controller. Esto significa que será la escena principal tras pasar a través del Navigation Controller. Por lo que dispondrá de la barra de navegación y será mostrada en primer lugar, una vez haya pasado por el Navigation Controller.
Y ahora tenemos el Segue:

Los Segues son las conexiones con la navegación, son los elementos visuales dentro del storyboard que nos permitirán realizar cambios entre escenas.
Este tipo de segue es especial ya que permite establecer la escena principal o Root View Controller para el Navigation Controller.
Si queremos hacer que otra escena sea la Root View Controller debemos arrastrar con el control pulsado desde el Navigation Controller hasta otro View Controller y al soltar nos aparecerá un diálogo similar al siguiente:

Como podemos ver nos aparecen todos los tipos de Segue:

  • push: para la navegación
  • modal: saltos entre escenas sin navegación
  • custos: saltos personalizados
  • root view: para establecer root view controller con los Navigation Controller y Tab View Controller (como veremos más adelante).
Elegimos el root view y la nueva escena será la nueva Root View Controller.

Si ejecutamos la aplicación vemos lo siguiente:

Como puede verse disponemos del tableview y además de la barra de navegación arriba. Por lo que ya tenemos disponible la escena del Listar.

Para cambiar el título de la barra de navegación deberemos hacerlo desde la escena del Root View Controller, haciendo doble click en el título. A efectos prácticos funciona como una Label:

Lo cambiamos y ponemos Listado. Si lo volvemos a ejecutar veremos que ya está cambiado el título:

 

Añadir

Ahora coloquemos una nuevo View Controller para el Añadir. Arrastrando el View Controller al storyboard. Ahora para crear el salto entre escenas necesitamos incluir un nuevo botón que permita que al pulsarlo nos lleve a la nueva escena. En este caso vamos a escoger un nuevo tipo de botón que se utiliza para las barras de navegación, el Bar Button Item:

Este tipo especial de botón lo podemos colocar en la barra de navegación, y al ser más sencillo dispone de menos eventos asociados. Al arrastrarlo a la barra de navegación del Listado y cambiar el título quedará mas o menos así:

Ahora es cuando debemos colocar un nuevo segue para enlazar el botón de añadir con la nueva escena. Para ello debemos con el control pulsado tirar una línea desde el botón hasta la nueva escena:

Al soltar el botón del ratón nos aparecerá un nuevo diálogo contextual a la operación:

Para que funcione apropiadamente el segue y nos mantenga la navegación seleccionamos push y eso hará que aparezca el segue de tipo push entre las dos escenas:

Si pulsamos sobre él podemos ver que en el inspector de atributos aparece lo siguiente:

Lo importante de esta captura es que podemos elegir el Style, que son los distintos tipos de segue que hemos visto anteriormente y el Identificador del segue. Este identificador nos permitirá modificar por programación aquellas cosas que queramos modificar del View Controller que arranquemos. De momento nos sirve desde el diseño del Storyboard sin necesidad de programar nada hacer el salto entre escenas.

Por supuesto en la escena de Añadir aparecerá la barra de navegación y podemos modificar su título:

Si ejecutamos la aplicación veremos que efectivamente al arrancar la aplicación y pulsar el botón de añadir nos lleva a la siguiente escena:

Como puede verse en la captura al entrar en la escena de Añadir, aparece la barra de navegación y el botón que permite Volver a la anterior escena, como el título de la anterior escena es el de Listado esto es lo que aparece en el botón que nos permite volver.

En el siguiente tema veremos como ir añadiendo nuevas pantallas a nuestro CRUD.

Licencia Creative Commons

Curso de iOS7: IBOutlet e IBAction

Introducción

Unos de los patrones principales que ya comentamos en el tema de Patrones de Diseño fue el de Target-Action. Este concepto puede ejemplificarse con el uso de los IBOutlet e IBAction. Veremos a continuación cómo utilizarlos en el Xcode5 en una aplicación iOS7.

IBOutlet

Este tipo de patrón nos va a permitir relacionar objetos que hay definidos en la vista, con propiedades que definamos en el código de la clase del ViewController que tengamos asignada a dicha Escena.

Empezaremos como siempre con una Simple View Applicaction, si tienes dudas consulta el tema de Mi Primera Aplicación iOS y nos encontraremos con un View Controller vacío:

A continuación buscamos una label en el inspector de objetos:

Escribimos label en el filtrador de objetos:

y nos aparecerá la label en el inspector:

La arrastramos al View Controller de nuestra aplicación:

De esta manera aparecerá la etiqueta dentro de nuestra escena.
Seleccionamos la etiqueta y nos aparecerán sus atributos en el inspector:

Ahora es cuando debemos relacionar esta vista con el código. Para empezar debemos asegurarnos de que el View Controller del storyboard tiene asignado una clase View Controller. Para ello deberemos seleccionar el View Controller desde el Storyboard, bien desde los detalles de la escena:

O bien desde la vista de la escena, huso debajo de la pantalla de la escena, en el botón amarillo:

de ambas maneras podemos ver que en la vista de la escena el view controller nos aparece seleccionado en color azul:

Así en la parte de la derecha en el Identity Inspector tendremos lo siguiente:

Com podemos ver en la captura veremos que el campo class está rellenado y nos indica el nombre de la clase ViewController, por lo que es cierto que esta escena tiene un ViewController asignado y podemos relacionar esta escena con su código.

A continuación deberemos cambiar el modo de vista de edición para poder disponer al lado izquierdo la escena y a la derecha el código de la clase, preferiblemente el fichero de cabecera de la misma. Para ello pulsamos en el botón del Assistant Editor, que tenemos arriba a la izquierda de la ventana:

Esto nos permitirá dividir la pantalla de edición en dos:

Com podemos ver en la parte derecha está seleccionado el fichero de implementación por lo que deberemos cambiarlo al fichero de cabecera para ello seleccionaremos en la parte superior de la ventana del código para cambiar de fichero:

Como podemos ver en la captura la parte superior funciona como un selector de ficheros, dependiendo del que seleccionemos así nos parecerá en el editor uno u otro fichero. En este caso seleccionamos en de cabecera por lo que debería aparecernos algo similar a esto:

Como puede verse es el fichero de cabecera vacío.

Ahora es cuando debemos relacionar la vista, en este caso una label, una etiqueta como una propiedad de la clase ViewController. Para ello con a vista seleccionada y con el control pulsado arrastramos y soltamos la vista en el código:

Como puede verse en la captura nos aparece una línea de color azul cuando la arrastramos y debemos situarla entre el @interface y el @end. Nos aparece dentro del código una linea azul con un círculo en la parte izquierda de la línea, indicándonos donde se colocará el código generado. Al soltar nos debería aparecer el siguiente diálogo contextual:

Veamos los campos en detalle:

  • Connection: indicamos el tipo de conexión con la vista, en este caso nos interesa Outlet, pero podemos encontrar también Action (que veremos más adelante)
  • Objecto: nos aparece ya seleccionado View Controller
  • Name: el nombre que queremos darle a la propiedad, por ejemplo etiqueta
  • Type: tipo de vista del objeto
  • Storage: atributo que le asignaremos a la propiedad, aquí podemos dejar Strong.

Una vez puesto el nombre de la propiedad pulsamos en el botón Connect y debería aparecernos lo siguiente en el código de la clase:

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

Como puede verse se ha declarado automáticamente una nueva propiedad del tipo UILabel. Todas las Vistas empezarán por UI, con el nombre indicado. Además nos coloca la palabra reservada IBOutlet  delante del tipo del dato. Esta palabra permite a esa propiedad ser relacionada con un elemento en la vista.
Pongo captura para que veamos un pequeño detalle:

Como puede verse en la captura aparece un círculo al lado de la línea de la propiedad de la clase y si pasamos el ratón por encima de ella veremos que se selecciona la etiqueta relacionada.

Otra manera de comprobar que esta relación existe es desde la vista de conexiones. Por ejemplo si seleccionamos la label desde la escena, veremos lo siguiente:

Como puede verse la propiedad etiqueta aparece conectada con el ViewController. Si pulsáramos en la X que sale a la derecha del View Controller quitaríamos esa conexión.

Si seleccionamos el View Controller desde la escena, veremos lo siguiente en el Inspector de Conexiones:

Como puede verse hay un resumen de Outlets relacionados con propiedades dentro del View Controller. Nos aparecen tanto la propiedad de la etiqueta relacionada con la Label de la escena, como la view, propiedad intrínseca de todo View Controller relacionada con el View de la Escena.

Debemos tener mucho cuidado con que las vistas estén relacionadas correctamente con las propiedades de la clase, porque si esto no lo realizamos correctamente, puede darse el caso de que la aplicación no arranque correctamente. Sobre todo debemos tener mucho cuidado si cambiamos los nombres de las propiedades de la clase sin haber cambiado también la relación con la vista.

Existe otra manera a la hora de relacionar propiedades con elementos en la vista, pero esta manera explicada es la más rápida.

Nota: Toda vista que tengamos que modificar desde código deberá ser un IBOutlet

IBAction

De la misma manera que hemos creado un Outlet vamos a intentar generar un IBAction. Los IBAction será la manera que tengamos de modificar comportamientos ante eventos que se puedan disparar en la pantalla. Por ejemplo pulsar en un botón. El comportamiento por defecto al pulsar un botón en iOS es no hacer nada. Pero si queremos modificar ese comportamiento debemos asociar una funcionalidad al Evento de pulsar el botón.

Para poner un ejemplo debemos seguir los mismos pasos que hemos realizado anteriormente para añadir un botón.

Busca el botón en el inspector de objetos:

Arrastralo a la Escena:

Cambiale el title (texto que sale en el botón) en sus atributos y ponle por ejemplo, Pulsame:

Quedará algo similar a esto:

Ahora con la Vista dividida, y teniendo seleccionado en la derecha el fichero de cabecera de la clase, arrastra con el control pulsado el botón a la vista de código:

De la misma manera que hicimos con el IBOutlet nos sale una línea azul cese la vista hasta el código, según lo arrastramos y nos sale una línea azul indicando donde aparecerá el código generado dentro del fichero de la clase. Una vez soltamos nos sale el diálogo de creación de una conexión:

Veamos en detalle los campos, una vez seleccionamos en el Connection-> Action:

  • Connection: dejamos selecionado Action
  • Object: vemos que esta puesto View Controller
  • Name: nombre del método que crearemos en la clase para que se ejecute cada vez que se dispare el evento sobre esa vista, en este caso pulsa
  • Type: tipo del dato que nos envían al invocar el método, en este caso id. Como ya vimos en el Curso de Objective C, id representa un puntero a un objeto.
  • Event: Evento que queremos relacionar con el método. O dicho de otro modo el evento que va a disparar el comportamiento especial que estamos programando. En este caso dejaremos Touch Up Inside, que es lo más parecido al Click del botón.
  • Arguments: aquí dejaremos seleccionado Sender, que será el nombre del objeto que nos pasen por parámetro al método.
Después pulsaremos en Connect y nos aparecerá lo siguiente en el fichero de cabecera:
– (IBAction)pulsado:(id)sender;

Como en el anterior caso pongo captura del código generado y su conexión.

Como puede verse al pasar el ratón por encima del círculo de la línea de código del IBAction también se resalta en la escena la Vista conectada.
Y seleccionando el View Controller en la escena, en el inspector de Conexiones sale lo siguiente:
Como puede verse se relaciona el nombre del método con el botón Pulsame con el Evento Touch Up Inside.
Para cambiar al modo normal de edición sólo debemos seleccionar el botón de Editor Standart:
También se nos ha debido generar una nueva implementación del método en el fichero de implementación de la clase, si lo seleccionamos, ahora debería aparecer en el editor algo similar a esto:
– (IBAction)pulsado:(id)sender {
}
Pongo captura porque aquí también aparece el círculo al lado de la implementación:
Ahora es cuando tocaría realizar algo con esta implementación. Por ejemplo saquemos un mensaje por consola, con un NSLog:
– (IBAction)pulsado:(id)sender {
    NSLog(@”Ha pulsado el botón!”);
}
De esta manera si ejecutamos la aplicación con Comando + R, veríamos algo similar al esto cuando pulsemos el botón:

Curso de iOS7: Instruments

Instruments

Instruments es la herramienta de profiling (análisis de rendimiento) integrada en Xcode. Esta herramienta nos permitirá optimizar el rendimiento de nuestra aplicación así como detectar fallos en la aplicación.

Funcionalidades

Las funcionalidades principales de la aplicación Instruments son las siguientes:
  • Recolectar información de la aplicación
  • Analizar los procesos de asignación de memoria
  • Realizar búsquedas de fugas de memoria (memory leaks).
  • Localizar problemas de rendimiento.
  • Medir la Entrada/Salida.
  • Automatizar pruebas de interfaz.

Como entrar a Instruments

Desde la ventana principal de Xcode pulsamos Comando+I o desde el menú Product->Profile y nos aparecerá la siguiente pantalla:
Como puede verse lo que nos pregunta es el tipo de análisis que queremos realizar. Una vez elegido pulsamos en el botón profile y nos aparece una pantalla similar a la siguiente:

Partes de la interfaz

Empezaremos por los controles principales:
Como puede verse es una pantalla similar en interfaz a la que tenemos en el Xcode. De esta manera podemos ver los controles de arranque y parada del análisis:
El principal será el botón de grabación que es el que nos permitirá arrancar y parar la aplicación para empezar el análisis.
En la parte izquierda podemos ver el área de perfiles:
En esta caso como sólo estamos analizando los tiempos de ejecución sólo disponemos de un perfil seleccionado:
En la parte inferior en donde podemos ver en detalles cada uno de los elementos que tienen que ver con el perfil seleccionado:
En este caso podemos ver las distintas llamadas a función que hacemos en la aplicación, ordenadas por su tiempo de ejecución en la parte derecha y en la parte izquierda los menús de selección de llamadas.
Por otra parte nos permite ver también el detalle de dichas llamadas en la parte de la derecha:
En posteriores tema veremos como utilizar esta herramienta para distintos usos.

Referencias

Suscríbete al Boletín

Si quieres estar al tanto de las novedades del blog, ya sabes :)
* = campo obligatorio

powered by MailChimp!

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. ACEPTAR

Aviso de cookies