Hola,
El siguiente paso para investigar sobre cada tecnologia que necesito usar en mi tesis:
Próxima semana: cargar algo en OpenGL al mismo tiempo que objetos de UI propios de iPhone.
Chao !
Información sobre mi avance en desarrollo en Objective-C para iPhone y uso del API de Realidad Aumentada
27 de febrero de 2010
Descargando archivos por HTTP
Hola,
Aquí coloco un ejemplo de cómo descargar archivos por HTTP, este usa la clase NSURL y obtiene todos los bytes de la página Web indicada de manera asíncrona.
Este ejemplo muestra que los datos se pueden ir recibiendo por fragmentos en nuestra aplicación (tan pronto estén disponibles), es decir, no hay que esperar a que llegue todo el contenido de la página para poder tener acceso a ella.
La referencia de Apple en la que me basé fue la siguiente:
El código fuente se encuentra aquí y la aplicación se vé así:
Chao !
Aquí coloco un ejemplo de cómo descargar archivos por HTTP, este usa la clase NSURL y obtiene todos los bytes de la página Web indicada de manera asíncrona.
Este ejemplo muestra que los datos se pueden ir recibiendo por fragmentos en nuestra aplicación (tan pronto estén disponibles), es decir, no hay que esperar a que llegue todo el contenido de la página para poder tener acceso a ella.
La referencia de Apple en la que me basé fue la siguiente:
- URL Loading System: Introduction to URL Loading System (en especial: URL Loading System: Using NSURLConnection)
- NSURL Class Reference
El código fuente se encuentra aquí y la aplicación se vé así:
Chao !
14 de febrero de 2010
Tutorial 2: Hola Mundo++
Hola,
Hoy voy a mostrar como hacer interacción con elementos de la GUI, particularmente con un botón.
La interfaz a desarrollar es esta:
En esta aplicación hay un botón que dice "Hola Mundo" y al darle click queremos que cambie a "Hello World", al darle click de nuevo queremos que cambie a "Hola Mundo" otra vez, y así sucesivamente.
El código fuente del Tutorial 1 nos servirá como punto de partida, por lo que en este tutorial solamente vamos a explicar las conexiones que debemos hacer para que nuestro botón ejecute una pieza de código que modifica el texto contenido dentro del mismo botón.
Cambios en el código fuente
Primero, como dentro de nuestro código vamos a tener que modificar un elemento de la GUI necesitamos crear un atributo dentro de nuestra clase HelloWorldView.h que permita referenciar al elemento gráfico. Esto se logra creando un atributo de tipo UIButton* así:
UIButton *button;
Y declarando una propiedad con el mismo nombre y anotada con IBOutlet así:
@property (nonatomic,retain) IBOutlet UIButton *button;
Pero como además vamos a necesitar llamar a nuestro código fuente desde una acción del botón de la GUI, necesitamos declarar una función callback (como un listener de Java), de esta manera:
Hasta aquí no hemos creado conexiones pero la idea es que:
La función que acabamos de crear usa algunos mensajes que no conocemos:
Listo, todo el andamiaje de código fuente está terminado, ahora falta construir la respectiva parte en la GUI.
Modificación de la GUI
Recuerdan el "Interface Builder" ? Bueno pues necesitamos abrirlo y seleccionar nuestro botón. Aquí lo que vamos a hacer es decirle a nuestro botón "cuando alguien te "toque adentro" debes invocar el método buttonCallback.
Hacer esto es fácil con el "Interface Builder" pues es sólo Drag n Drop. Seleccionamos entonces neustro botón y en la ventana "Button Components" deben mostrarse todas las posibilidades de acciones que el botón puede realizar, vamos a buscar a "Touch up inside" y vamos a tomar el círculo a su derecha y arrastrarlo hasta el elemento "File's owner" de la ventana HelloWorldView.xib
Esto suena complicado, por lo cual lo muestro gráficamente en esta imagen:
Listo, ya creamos la conexión entre nuestro botón y la función buttonCallback que creamos antes.
Pero aún falta la configuración para que nuestra propiedad button referencie al botón real, esto lo hacemos de la siguiente manera:
Aquí estamos asignando a "New Referencing Outlet" de nuevo a "File's Owner", y cuando nos aparezca la ventana para elegir la propiedad a la que queremos asignar la referencia, escogeremos button.
Al final nuestra ventana debe quedar así:
Listo, ahora si eso es todo. Sólo falta ejecutar la aplicación y dar click en el botón varias veces para ver como cambia su texto cada vez.
Dé click aquí para descargar el código fuente de este tutorial
Chao, hasta la próxima !
Hoy voy a mostrar como hacer interacción con elementos de la GUI, particularmente con un botón.
La interfaz a desarrollar es esta:
En esta aplicación hay un botón que dice "Hola Mundo" y al darle click queremos que cambie a "Hello World", al darle click de nuevo queremos que cambie a "Hola Mundo" otra vez, y así sucesivamente.
El código fuente del Tutorial 1 nos servirá como punto de partida, por lo que en este tutorial solamente vamos a explicar las conexiones que debemos hacer para que nuestro botón ejecute una pieza de código que modifica el texto contenido dentro del mismo botón.
Cambios en el código fuente
Primero, como dentro de nuestro código vamos a tener que modificar un elemento de la GUI necesitamos crear un atributo dentro de nuestra clase HelloWorldView.h que permita referenciar al elemento gráfico. Esto se logra creando un atributo de tipo UIButton* así:
UIButton *button;
Y declarando una propiedad con el mismo nombre y anotada con IBOutlet así:
@property (nonatomic,retain) IBOutlet UIButton *button;
Pero como además vamos a necesitar llamar a nuestro código fuente desde una acción del botón de la GUI, necesitamos declarar una función callback (como un listener de Java), de esta manera:
- (IBAction)buttonCallback:(id)sender;
Hasta aquí no hemos creado conexiones pero la idea es que:
- Cuando queramos cambiar desde el código el texto deel botón de la GUI usemos nuestra propiedad button
- Cuando queramos invocar desde nuestro botón de la GUI el código fuente de la aplicación usaremos la función buttonCallback
Pero si recordamos, al modificar el ".h" sólo declaramos las propiedades y funciones, mas no las implementamos (el "qué hacen" mas no el "cómo lo hacen"), por lo cual necesitamos modificar también nuestro ".m" para realizar las respectivas implementaciones.
Vamos a crear en HelloWorldView.m la función buttonCallback, tal como se muestra en la siguiente imagen, además de sintetizar nuestra propiedad button (recuerdan el código fuente del tutorial 1?).
También es de tener en cuenta que estamos decrementando el conteo de referencias de nuestra propiedad button en el método dealloc.
La función que acabamos de crear usa algunos mensajes que no conocemos:
- button:titleForState
Este mensaje obtiene el texto que aparece dentro del botón. El "estado" al que hace referencia este método es uno de varios posibles estados en que el botón puede estar ("desactivado" por ejemplo). El valor retornado es un NString, por lo que para comporarlo con otro NSString se debe usar el método NSString:compare: - button:setTitle::forState
Este método es el compañero del anterior, en vez de obtener el texto del botón, lo cambia.
Listo, todo el andamiaje de código fuente está terminado, ahora falta construir la respectiva parte en la GUI.
Modificación de la GUI
Recuerdan el "Interface Builder" ? Bueno pues necesitamos abrirlo y seleccionar nuestro botón. Aquí lo que vamos a hacer es decirle a nuestro botón "cuando alguien te "toque adentro" debes invocar el método buttonCallback.
Hacer esto es fácil con el "Interface Builder" pues es sólo Drag n Drop. Seleccionamos entonces neustro botón y en la ventana "Button Components" deben mostrarse todas las posibilidades de acciones que el botón puede realizar, vamos a buscar a "Touch up inside" y vamos a tomar el círculo a su derecha y arrastrarlo hasta el elemento "File's owner" de la ventana HelloWorldView.xib
Esto suena complicado, por lo cual lo muestro gráficamente en esta imagen:
Listo, ya creamos la conexión entre nuestro botón y la función buttonCallback que creamos antes.
Pero aún falta la configuración para que nuestra propiedad button referencie al botón real, esto lo hacemos de la siguiente manera:
Aquí estamos asignando a "New Referencing Outlet" de nuevo a "File's Owner", y cuando nos aparezca la ventana para elegir la propiedad a la que queremos asignar la referencia, escogeremos button.
Al final nuestra ventana debe quedar así:
Listo, ahora si eso es todo. Sólo falta ejecutar la aplicación y dar click en el botón varias veces para ver como cambia su texto cada vez.
Dé click aquí para descargar el código fuente de este tutorial
Chao, hasta la próxima !
9 de febrero de 2010
Explicación del código fuente de Hola Mundo
Hola,
Hoy explico el código fuente del programa "Hola Mundo".
Para esto posiblemente sea necesario conocer algo de C++ y Java ...
Recordemos el código del archivo "HelloWorldAppDelegate.h":
Vamos a recorrer el archivo explicando qué es cada línea:
Ahora vamos para el segundo archivo de código fuente que modificamos, "HelloWorldAppDelegate.m":

Este archivo es la implementación de la clase que declaramos en "HelloWorldAppDelegate.h".
Chao !
Hoy explico el código fuente del programa "Hola Mundo".
Para esto posiblemente sea necesario conocer algo de C++ y Java ...
Recordemos el código del archivo "HelloWorldAppDelegate.h":
Vamos a recorrer el archivo explicando qué es cada línea:
- En Objective-C los comentarios de una sola línea comienzan por // tal como en Java y C++. Así que las primeras 7 líneas son sólo comentarios.
- La siguiente línea es una sentencia "import" tal como las de C++. Estas se usan para incluir el contenido compelto de un archivo (en este caso UIKit/UIKit.h) dentro del archivo que usa la sentencia import. Esto sirve para poder usar funciones, clases, variables, etc,. que están declaradas en esos archivos que estamos importando.
- En la siguiente línea comenzamos hacemos un "forward-reference": @class HelloWorldView; La cual es análoga a la sentencia "class HelloWorldView;" de C++. Esta sentencia se usa para indicar que dentro del código vamos a hacer referencia a una clase llamada HelloWorldView, pero tan sólo estamos diciendo que esa clase "existe en algún lugar", sin decir qué métodos o atributos tiene. En Java no hay necesidad de hacer tal cosa.
- La sentencia "@interface" sirve para declarar una clase. Aquí sólo decimos qué atributos, propiedades y métodos tiene la clase, más no decimos qué hace cada uno de esos métodos. A diferencia de C++ y Java, la declaración de la calse no acaba en cuanto cerramos la llave de la declaración. La declaración de una clase en Objective-C va desde la sentencia "@interface" hasta la sentencia "@end". Las llaves que hay en medio son solamente para declarar los atributos de la calse, pero fíjense que propiedades se declaran por fuera (los métodos también pero en este ejemplo no hay ninguno).
- En C++ y Objective-C los punteros a objetos se declaran de la misma manera: HelloWorldView *myView; La declaración equivalente en Java sería: HelloWorldView myView; En cualquier caso, esto indica que estamos declarando una variable que contendrá una referencia a un objeto de clase HelloWorldView. En esta clase se declaran dos punteros (o referencias si venimos del munod Java).
- Ahora continuamos con la declaración de las propiedades, para los que conocen de .NET, se trata del mismo tipo de propiedades. Una propiedad no es más que una maenra de ahorrarnos la esccritura de un código repetitivo: se le indica al compilador que debe crear un método "get" y un método "set" para una variable de nuestra clase, de modo que quede totalmente encapsulada. Debido a que el get y el set pueden ser implementados de muchas maneras diferentes, debemos decirle al compilador de qué forma queremos que los implemente. Para esto se usan las palabras "nonatomic" y "retain". "nonatomic" la explicaré más adelante. "retain" indica que al momento de hacer la asignación del atribuyto de nuestra clase, debemos decrementar el conteo de referencias de este atributo. Para los que vienen de Java, el conteo de referencias es algo automático, eprop para quienes vienen de C++ sabrán el problema que es decidir si una clase es dueña de una referencia, o si el dueño es otro, y quién es responsable de liberar la memoria del objeto referenciado. Objective-C usa una aproximación entre la de Java y C++, en la que se usa el conteo de referencias, pero el programador debe decir exactamente cuándo debe incrementar o decrementar dicho conteo.
Ahora vamos para el segundo archivo de código fuente que modificamos, "HelloWorldAppDelegate.m":

Este archivo es la implementación de la clase que declaramos en "HelloWorldAppDelegate.h".
- De nuevo, sentencias import para traer el contenido de otros archvios necesarios para la compilación.
- La sentencia "@implementation" indica que vamos a implementar una clase. Esta sentencia termina cuando encontramos la sentencia "@end". Dentro de estas sentencias debemos sintetizar las propiedades y declarar los métodos (sinteti...qué?).
- La sintetización de las propiedades no es más que ordenarle al compilador que cree en ese momento los métodos "get" y "set" de cada propiedad que hayamos declarado. Recordemos que en el ".h" sólo declaramos las propiedades, pero todos los métodos (incluidos los get y los set) deben ser implementados en el ".m". Hay que poner especial cuidado a que la sentencia no es "@synthetize" sino "@synthesize", osea, no es como en el español.
- La siguiente línea es:
- (void) applicationDidFinishLaunching:(UIApplication*)application {
Así comienza la implementación de un método en Objective-C, el equivalente en C++ y Java sería algo como:
void applicationDidFinishLaunching(UIApplication* application) {
Bueno, sin el "*" en Java. - Para invocar a los métodos en Objective-C (enviar mensajes le llaman en este lenguaje) se usan los corchetes, por tanto la siguiente línea invoca 4 métodos diferentes, todos en una línea (cada invocación es el uso de un "[" y un "]").
El primer método que se está ejecutando es "[HelloWorldView alloc]". Este es un método estático de la clase "HelloWorldView", el cual funciona como el "malloc" en C++. Normalmente para crear un objeto uno usaría "new" en Java y C++, este "new" realiza la obtención de la memoria para el nuevo objeto e invoca al constructor.
Bueno, en Objective-C no hay "new" por lo que toca hacer ambos pasos descritos anteriormente por separado: primero obtenemos la memoria para el nuevo objeto (con el "alloc") y luego invocamos al constructor del objeto para que inicialice su estado interno (atributos).
El constructor aquí se llama "initWithMibName:bundle:" el cual es un constructor con dos parámetros, uno se llama "initWithMibName" y el otro se llama "bundle". Aquí comienzan a aparecer diferencias significativas con Java y C++ ... - No voy a explicar lo que hace cada uno de esos métodos (mensajes) a excepción de "autorelease". Este es un mensaje que se le envía a un objeto apra decrementar su conteo interno de referencias, de modo que su memoria sea liberada en el futuro (cuándo? aquí con futuro me refiero a ... leer NSAutoreleasePool).
- Por último, el método "dealloc" es el que se llama justo antes de que un objeto sea destruido (cuando su conteo de referencias llega a 0). Aquí se liberan los recursos que haya adquirido el objeto. Es similar al "finalize" en Java y al destructor en C++.
Chao !
1 de febrero de 2010
Recursos para programadores de iPhone
Hola de nuevo,
Este pequeño post es para dejarles unas rutas de donde se puede obtener información acerca de la programación en iPhone. Todas son oficiales de Apple:
El iPhone Developer Center es la principal fuente de documentación.
De aquí podemos descargar el Xcode y el iPhone SDK (en caso de que no los tengamos ya instalados), además de documentación para comenzar a aprender a programar para iPhone.
Bueno, aquí les dejo los enlaces:
Chao!
Este pequeño post es para dejarles unas rutas de donde se puede obtener información acerca de la programación en iPhone. Todas son oficiales de Apple:
El iPhone Developer Center es la principal fuente de documentación.
De aquí podemos descargar el Xcode y el iPhone SDK (en caso de que no los tengamos ya instalados), además de documentación para comenzar a aprender a programar para iPhone.
Bueno, aquí les dejo los enlaces:
- iPhone Development Quick Start
- Getting Started with iPhone OS
- Learning Objective-C: A Primer
- Introduction to The Objective-C Programming Language
Chao!
Suscribirse a:
Entradas (Atom)









