Subscribe Twitter Twitter

viernes, 19 de noviembre de 2010

Actionsheet

Hola a todos, retomando el tema de los artículos hoy voy a hablaros sobre el UIActionSheet. Seguramente casi todos vosotros lo conocéis aunque algunos tal vez no asocien su nombre al control.

¿Qué es el control UIActionSheet?

El control UIActionSheet es un control que aparece desde la parte de abajo de la pantalla y que suele usarse para alertar al usuario y darle una serie de opciones con la opción de destacar algunas de ellas. Este control lo podemos ver en la agenda cuando vamos a eliminar un contacto y nos pide la confirmación.

Uso de un UIActionSheet en nuestra aplicación:

A la hora de trabajar con este control lo primero que debemos hacer es indicar en la clase en la que vayamos a trabajar con él en el .h que vamos a usar su delegado, el cual se llama "UIActionSheetDelegate" quedando por lo tanto nuestro .h de la siguiente forma:

miClase:UIViewController <UIActionSheetDelegate>

Una vez hecho esto, iremos al .m y crearemos nuestro control con el siguiente código:

UIActionSheet *myActionSheet=[[[UIActionSheet alloc]initWithTitle:@"RemoveAll" delegate:self cancelButtonTitle:@"NO" destructiveButtonTitle:@"YES" otherButtonTitles:@"Not sure", @"maybe",@"not sure",@"other time",@"sometimes",@"never", nil]autorelease];

[myActionSheet showInView:self.view];


Una vez visto el código vamos a analizarlo:
El botón que pongamos como destructiveButton tendrá el fondo por defecto rojo.
El botón que pongamos como cancelButton tendrá el fondo por defecto en gris.
Los botones que pongamos en otherButton su fondo será blanco y si ponemos demasiados elementos automáticamente te crea una tabla con scroll tal y como se ven en la siguiente imagen:




Ahora con el control ya creado nos interesará capturar en qué opción han pulsado el usuario y para eso gracias a que declaramos en el .h su delegado tendremos acceso a capturar los eventos asociados a ese control entre los que está uno que nos permite capturar en qué botón ha pulsado el usuario entre otras cosas.

Os pongo el ejemplo de como vamos a capturar donde ha pulsado:


-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex(NSInteger)buttonIndex {

NSLog(@"ButtonsIndex: %i",buttonIndex);
if (buttonIndex==[actionSheet cancelButtonIndex])
{
NSLog(@"Cancelled");
}

if (buttonIndex == [actionSheet firstOtherButtonIndex])
{
NSLog(@"primer boton de otros: %@",[actionSheet buttonTitleAtIndex:buttonIndex]);
}

if (buttonIndex == 2)
{
NSLog(@"Otra");
}


Como podéis ver en el ejemplo el método que estamos usando para capturar el evento es "didDismissWithButtonIndex" y estamos recibiendo qué índice ha sido pulsado, y luego estamos comparando las los 3 tipos posibles de boton (los 2 destacados y cualquiera de los de la tabla) a través de su índice.

Por último relacionado con este control os dejo los links que me parecen de interés:Métodos que nos permiten capturar acciones del control a través de su delegado:

Link

Todas las propiedades y métodos del actionSheet propiamente dicho:
Link

lunes, 13 de septiembre de 2010

Multiidioma (I)

En esta primera parte vamos a explicar como hacer que nuestras aplicaciones sean multiidioma. En primer lugar decir que cuando hacemos una aplicación multiidioma no es necesario si no queremos hacerlo en todos los idiomas de los mercados en los que pongamos nuestra app en el caso en el cual el idioma del dispositivo no esté contemplado en la aplicación cogerá por defecto el inglés.

1. Crear un fichero de tipo Strings file el cual será nuestro fichero de recursos.

Lo vamos a crear en la carpeta de Resources y para ello haremos botón derecho sobre la carpeta de Resources,  Add - New File y seleccionados debajo de MAC OS X la opción Resources y dentro de está en la parte derecha elegimos el fichero de tipo Strings File  y lo llamaremos Localizable.strings (hay que llamarlo así).



2. Ahora ya tenemos un fichero de recursos pero nosotros necesitamos tener varios idiomas,para ello lo que haremos será "crear diferentes versiones" de este fichero de recursos.

Botón derecho sobre el fichero Localizable.strings, Get info y en la pestaña General haremos click sobre el botón Make File Localizable



3. Volvemos a la pestaña general y ahora tenemos una pantalla con una caja de texto en la que pone solo English que este será el idioma por defecto.

4. Para añadir más idiomas, hacer clic en Add Localization y en función del idioma que queramos pondremos el código iso del idioma, otra opción es seleccionar del combo el idioma que queramos o escribirle tal cual, yo recomiendo poner el código iso. Una vez añadidos los deseados cerramos la pantalla.




Listado de los códigos de los idiomas aquí
5. Ahora verás que ha aparecido una flechita a la izda del fichero, si le damos se despliega y como  ves hay una versión del fichero Localizable.strings por cada idioma que hayamos añadido.


El formato de las diferentes versiones del fichero Localizable.string será el siguiente:

(hacemos clic sobre la versión "es"):
En el español:

"Saludo" = "Hola";
"Boton" = "Botón";

(hacemos clic sobre la versión "English")
En el de inglés:

"Saludo" = "Hello";
"Boton" = "Button";


Como has podido ver estos ficheros de recursos son listados de pares clave-valor (ambos cadenas de texto).

Importante:  A pesar de ser cadenas de texto no van precedidas de @

6. Para obtener el texto correspondiente a la clave "Saludo" lo haremos de la siguiente manera:

NSLocalizedStrings(@"Saludo",@"");

EJEMPLO:

Para asignar el valor a una label:   etiqueta.text =NSLocalizedString(@"Saludo",@"");

Para asignar el texto de un botón: [miBoton setTitle:NSLocalizedString(@"Boton",@"")forState:0];


Tenemos preparado un tutorial con esto, debido a los problemas con el audio no se escucha en youtube. Por lo tanto en cuanto se resuelva dicho problema pondremos el video.

jueves, 12 de agosto de 2010

Copias de Seguridad del proyecto

¿Cuántas veces has estado programando y cosas que funcionaban dejan de funcionar...? Para evitar esto en XCode disponemos de una herramienta muy sencilla y útil.

Podemos hacer "capturas instantáneas" (crear versiones) del proyecto e irlas guardando y en un momento dado restaurar y que el proyecto vuelva a una versión concreta, ésta herramienta nos va a facilitar llevar esta gestión de manera sencilla y eficiente.



Para crear una versión puedes hacerlo de dos maneras:
* XCode : File - Make Snapshot
* Acceso directo: comando(manzana) + control + S
*Primera opción (make) del gestor de versiones , para abrir el gestor: en XCode: File - Snapshot

Gestión de versiones: File-Snapshots


Opciones en la parte superior:
- make: Crea una nueva versión
- delete: Elimina la versión seleccionada.
- restore: Restaura el proyecto a la versión seleccionada.
- hide: esconde la zona derecha de la pantalla donde se muestra el detalle de los cambios que se han realizado.

Justo debajo de este menú tenemos el listado de las versiones que tenemos guardadas y cuando seleccionamos una de ellas debajo aparece el detalle de la misma (nombre fecha y comentarios) y en la parte derecha de manera resumida los ficheros que se han modificado, si hacemos clic sobre cualquiera de los cambios debajo aparece el fichero antiguo y el actual para que veamos que cambio en concreto se ha producido.

Algo tal que así:



Y finalmente en la parte inferior izquierda sale un resumen de los ficheros eliminados, modificados y añadidos.


martes, 10 de agosto de 2010

Gestión de un UIView

Por cada fichero de interfaz .xib que tenga una vista (UIView) debemos tener una clase que será la encargada de manejar todo lo relacionado con ese .xib. Ésta clase heredará de la clase UIViewController y se encargará de gestionar todo lo relacionado con la vista asociada (UIView).

Aunque una misma clase en teoría puede manejar más de una vista en la práctica se tiene una clase por cada xib.

Ésta clase que hereda del UIViewController se encarga de gestionar además de los elementos que añadamos en la vista como por ejemplo botones, label... gestionará el ciclo de vida del UIView controlando por ejemplo los siguientes "eventos":

- didReceiveMemoryWarning: El controlador recibe un aviso de memoria.

-didRotateFromInterfaceOrientation: Se invoca después de que la vista ha rotado.

-willRotateToInterfaceOrientation:duration: Se invoca cuando comienza a rotar la vista, el duration indica el tiempo que va a tardar en rotar.

-viewDidAppear: Se invoca después de que la vista ha aparecido.

-viewDidDisappear: Se invoca después de que la vista ha desaparecido.

-viewDidLoad: Se invoca después de que la vista se ha cargado en memoria.

-viewWillAppear: Se invoca justo antes de que la vista aparezca.

-viewWillDisappear: Se invoca justo antes de que la vista desaparezca.

-willAnimateFirstHalfOfRotationToInterfaceOrientation:duration: Se ejecuta antes de la rotación de la primera mitad del interfaz y la duración que va a durar.

-willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:Se ejecuta antes de la rotación de la segunda mitad del interfaz y la duración que va a durar.

domingo, 8 de agosto de 2010

UIApplication

Toda aplicación del iphone tiene un objeto de tipo UIApplication el cual es el punto de entrada de la aplicación y se encargará de inicializar y de mostrar un UIWindow y cargar además en este UIWindow la primera vista a mostrar. Además este UIApplication debe encargarse de gestionar el ciclo de vida de la aplicación y para eso hace uso del UIApplicationDelegate. De todas maneras es el UIApplication el que recibe los eventos pero se gestionan mediante el delegado.

Los eventos que se manejan desde el UIApplicationDelegate son por ejemplo arrancar la aplicación , cerrar la aplicación o eventos como que entre una llamada mientras la aplicación se está ejecutando.

Vamos a detallar un poco más lo eventos que podemos manejar:

didChangeStatusBarFrame: El frame de la barra de estado ha cambiado.
willChangeStatusBarFrame: El frame de la barra de estado va a cambiar.

didChangeStatusBarOrientation: Cambia la orientación de la barra de estado
willChangeStatusBarOrientation:duration: La orientación de la barra de estado va a cambiar y el parámetro duration le indica cuanto va a durar la animación.

handleOpenURL: Le indica al delegado que quiere abrir una url.

applicationDidBecomeActive: Se ejecuta justo después de que la aplicación vuelva estar activa de nuevo. Por ejemplo te ha entrado una llamada y has terminado, la aplicación vuelve a estar activa y justo en ese momento se ejecuta este evento.

applicationDidFinishLaunching: Se ejecuta cuando la aplicación ha terminado de cargarse.

applicationDidReceiveMemoryWarning: Cuando recibe este mensaje es debido a que el SO le ha enviado este mensaje a la aplicación ya que se ha quedado el dispositivo sin memoria pero antes de cerrarla se le da una "oportunidad" de ejecutar este método para que se libere la memoria que se pueda de la app.

applicationSignificantTimeCharge: Se ha producido un cambio significativo en el tiempo durante la ejecución de tu aplicación.

applicationWillResignActive: Se ejecuta antes de que pase a inactiva por ejemplo te entra una llamada.

applicationWillTerminate: La aplicación se cierra.

applicationDidEnterBackground: La aplicación va a entrar en segundo plano pero si la aplicación no tiene implementado multitarea en este método deberías guardar los estados de la aplicación, liberar la memoria ya que se queda en "pausa" en segundo plano y cuando el usuario vuelve a entrar estará en el estado en el que se quedó pero cuando está en esta "pausa" si el SO necesita memoria la va a cerrar.

applicationWillEnterForeground: La aplicación vuelve a primer plano.


Nota: El UIapplicationDelegate de nuestra aplicación es el nombreAplicaciónAppDelegate, se generá automáticamente cuando creamos un nuevo proyecto (independientemente de la plantilla que usemos) y esa clase hereda de NSObject e implementa el protocolo UIApplicationDelegate.

Nota: Cuando hablamos de que se produce un evento o el delegado recibe un evento significa en realidad que se envía un mensaje concreto al delegado en función de lo que suceda y de esa manera ejecute el código correspondiente.

viernes, 6 de agosto de 2010

Versión móvil del blog

Ya tenemos la versión móvil del blog para que podáis leerlo desde el iphone/ipod o ipad pudiendo si queréis cambiar a la vista clásica.

Espero que os resulte útil.

martes, 3 de agosto de 2010

Programación desde cero: Procedimientos y funciones

No sé si te habrás encontrado en algún manual algo relacionado con los conceptos de procedimientos y funciones aunque no sea así es importante para lo que es fundamentos de la programación en general.

Tanto un procedimiento como una función son porciones de código que hacen algo y que se les ha dado un nombre, por ejemplo imagínate que dentro de una misma aplicación quieres comprobar si un año es bisiesto y para ello hay que hacer una serie de comprobaciones, pero tu en tu aplicación tienes que hacerlo en varios sitios por lo que si copias el mismo código varias veces iba a quedar muy redundante a parte que si por lo que sea te has equivocado en alguna condición de año bisiesto tienes que andar buscando por toda la aplicación en los sitios en los que la copiaste para ir modificándolo.

¿Qué hacemos? pues a ese trozo de código le asignamos un nombre por ejemplo "comprobacionBisiesto" y de esa manera en todas las partes de la aplicación en las que quiera comprobar si un año es bisiesto tendría que poner "comprobaciónBisiesto" y de esa manera cuando tengamos que hacer un cambio en "comprobaciónBisiesto" solo lo haremos una vez.


Pero por ejemplo tomando como base "comprobaciónBisiesto" para poder evaluar si año es bisiesto debo decirle a "comprobaciónBisiesto" cuál es el año que quiero que compruebe y por ello lo que hacemos es pasarle parámetros, ésto es común tanto cuando hablamos de procedimientos como de funciones en cambio la diferencia entre ambos es si esa porción de código que hemos escrito (comprobaciónBisiesto) devuelve algo o no, por ejemplo si queremos que devuelva un dato lo haremos con una función y sino con un procedimiento.

Hay lenguajes de programación que lo que nos permiten es las funciones y procedimientos que los parámtros de entrada (en este caso sería el año) puedan ser parámetros también de salida (para así devolver varios datos) pero eso depende del lenguaje de programación por lo que aquí no nos interesa ya que estamos hablando de programación en general.

Eso si en las funciones como solo se devuelve 1 dato y solo 1 dentro del trozo de código hay que hacer un return con la información a devolver ya sea un dato o una variable.


En nuestro caso de ComprobaciónBisiesto devolvería un tipo de dato booleano (verdadero/falso) y de esa manera sabríamos si lo es o no. En función del lenguaje de programación el tipo booleano puede tomar valores como 0/cualquier número, 0/1, true/false... esta representación va en función del lenguaje de programación.

En este caso lo que estamos haciendo es pasarle a la función un año y nos devuelve si es bisiesto o no.



Booleano comprobacionBisiesto(entero Año){
booleano esBisiesto

//Aquí irian todas las comprobaciones pertinentes

si (esBisiesto)
return verdadero
sino
return falso
// Otra opción más eficiente sería: return esBisiesto
}



En éste caso le pasamos como parámetro un tipo de dato entero y mostramos por pantalla su área pero como ves no devuelve nada ya que es un procedimiento.


MostrarAreaCuadrado(entero a){

mostrarPorPantalla(a*a);

}