08: Programas con entorno gráfico


Introducción

Al haber incrementado nuestro conocimiento de Objective-C, estamos ya preparados para crear un programa con Interfaz Gráfica de Usuario (GUI). En este punto debo confesar algo. Objective-C es una extensión de otro lenguaje de programación llamado C. Hasta ahora, prácticamente todo lo que hemos visto es simplemente lenguaje C. Así que, ¿dónde está la diferencia entre Objective-C y C?, pues precisamente en la parte "Objective". Objective-C trata con unos elementos abstractos llamados objetos.

Hasta ahora hemos tratado principalmente con números, hemos visto como Objective-C crea números en memoria y podemos manipularlos con operadores y funciones matemáticas. Esto nos viene bien cuando nuestra aplicación trabaja con números (por ejemplo, una calculadora). Pero ¿qué ocurre si nuestra aplicación es, digamos, un reproductor de música que usará canciones, listas de reproducción, artistas, etc.? ¿O si es un sistema de control de tráfico aéreo que tratará con aviones, vuelos, aeropuertos, etc.? Sería bueno poder manipular tales elementos con la misma facilidad con la que podemos manipular números.

Y aquí acuden los objetos. Con Objective-C puedes definir las clases de objetos con los que quieres tratar y después escribir aplicaciones para manipularlos.

Objetos en acción

Como ejemplo, veamos cómo se manejan las ventanas en un programa escrito en Objective-C, tal como Safari. Ve a una ventana abierta de Safari en tu Mac; en la parte superior izquierda hay tres botones. El botón rojo es para cerrar. ¿Qué ocurre cuando haces click en ese botón? Se envía un mensaje a esa ventana y en respuesta a dicho mensaje la ventana ejecuta código para cerrarse.

09 Object Action

Se envía un mensaje de cierre a la ventana

La ventana es un objeto. Puedes, por ejemplo, desplazarla. Los tres botones son objetos. Puedes pulsarlos. Estos objetos tienen una representación visual en la pantalla, pero no es así con todos; por ejemplo el objeto que representa la conexión entre Safari y un sitio web no tiene una representación visual.

10 Object Buttons

Un objeto (por ej. la ventana) puede contener otros objetos (p.ej. los botones)

Puedes tener tantas ventanas abiertas de Safari como quieras. Podrías pensar que los programadores de Apple:

  • a. Han programado previamente todas las posibles ventanas, usando su poder mental para anticiparse a todas las ventanas que tú podrías querer abrir, o …
  • b. Hicieron una especie de plantilla y dejan que Safari cree cada ventana a partir de esa plantilla cuando haga falta.

Por supuesto, la respuesta correcta es la b. Crearon un código, llamado clase, que define la ventana, incluyendo su aspecto y comportamiento. Cuando creas una ventana, realmente es la clase la que crea la ventana por ti. Esta clase representa el concepto de ventana y cualquier ventana concreta es realmente una instancia de ese concepto (de la misma manera que 76 es una instancia del concepto número).

Puedes imaginarte la clase como los planos de una casa, incluyendo la descripción de sus instalaciones, y objeto como cada una de las casas reales que se han construido a partir de ese proyecto.

Variables de instancia

La ventana que has creado está colocada en una posición determinada de la pantalla. Si minimizas la ventana en el Dock y la haces reaparecer, se coloca exactamente en donde estaba ¿Cómo lo hace? La clase define variables para recordar la posición y cada instancia de esa clase, es decir, cada objeto, contiene sus valores de posición.

Métodos

La clase también nos da acceso a una serie de acciones que puede realizar. Una de las acciones de la clase "ventana" es cerrarse. Cuando pulsas el botón para cerrar una ventana, el botón envía un mensaje de cierre a ese objeto de ventana. A esas acciones se les llama métodos. Como verás, se parecen mucho al concepto de funciones que ya hemos visto, así que si nos has seguido hasta aquí no vas a tener problema en aprenderlo.

Objetos en memoria

Cuando la clase crea un objeto de ventana para ti, reserva memoria (RAM) para almacenar su posición además de mucha otra información. Sin embargo, no hace una copia del código para cerrar la ventana; eso sería un desperdicio de memoria ya que el código es el mismo para todos los objetos de la misma clase. El código para cerrar la ventana necesita estar presente sólo una vez, pero cada objeto de ventana ha de tener acceso a todo el código de la clase a la que pertenece.

Como ya vimos anteriormente, el código que vamos a ver en este capítulo contiene algunas líneas para reservar memoria y dejarla a disposición del sistema al terminar. Pero aún es pronto para hablar sobre ello, lo veremos más adelante.

Ejercicio

Nuestra aplicación

Vamos a crear una aplicación con dos botones y un campo de texto. Si presionas un botón, aparecerá un valor en el campo de texto. Si presionas el otro botón, se introducirá otro valor en el campo de texto. Piensa en ello como una calculadora de dos botones que no puede hacer cálculos. Por supuesto, cuando aprendas más llegarás a hacer una calculadora real, pero es mejor ir paso a paso.

11 Our App

Un esquema de la aplicación que queremos crear

Cuando se pulse uno de los botones de la aplicación, enviará un mensaje. El mensaje contiene el nombre del método que se va a ejecutar. ¿A dónde se envía el mensaje? En el caso de la ventana, el mensaje de cierre se envía a ese objeto ventana, que es una instancia de la clase ventana. Lo que necesitamos en nuestro caso es un objeto capaz de recibir mensajes de cada uno de los dos botones y que pueda indicar al campo de texto que muestre un valor.

Nuestra primera clase

Así que primero debemos implementar nuestra propia clase y luego crear una instancia de ella. Ese objeto será receptor de los mensajes de los botones (ver esquema más abajo). Al igual que un objeto ventana nuestra instancia también es un objeto, pero no a diferencia de las ventanas, nuestro objeto no tiene una representación visual; sólo es algo dentro de la memoria de nuestro Mac.

Cuando nuestra instancia recibe un mensaje enviado por uno de los dos botones se ejecuta el método apropiado. Recordamos que el código de ese método está almacenado en la clase, no en la propia instancia. Durante la ejecución, este método modificará el texto del objeto campo de texto.

¿Cómo sabrá el método de nuestra clase cómo asignar el texto de un campo de texto? Realmente no lo sabe. Pero el propio campo de texto sí sabe como modificar su propio texto. Así que enviaremos un mensaje al campo de texto pidiéndole que haga el trabajo. ¿Qué contenido ha de tener ese mensaje? Por supuesto hay que indicar el objeto receptor del mensaje, que en este caso es el campo de texto. También necesitamos indicar qué es lo que queremos que haga el receptor, es decir, en este caso hay que dar el nombre del método que tiene el campo de texto para mostrar un texto (esto implica conocer los métodos que pone a nuestra disposición un campo de texto, ya hablaremos sobre ello). En este caso, nuestro mensaje también debe contener el valor que queremos que muestre. A los datos que hay que aportar al método (en este caso: el valor que queremos que muestre) se les llama argumentos.

12 Our Class

Un esquema del intercambio de mensajes entre objetos de nuestra aplicación

Este es el formato general para enviar mensajes en Objective-C, tanto sin argumentos [1.1], como con un argumento [1.2]:

//[1]
[receptor mensaje]; // [1.1]
[receptor mensajeQueRequiereUnArgumento:elArgumento]; // [1.2]

Como puedes ver en cada una de las sentencias, todo el contenido está encerrado entre corchetes, por supuesto con punto y coma al final. Dentro de los corchetes, primero aparece el objeto receptor del mensaje, seguido del nombre del método que vamos a invocar separado por espacio. Si se requiere un argumento, irá a continuación separado por dos puntos. [1.2].

Creación del proyecto

Veamos como llevar esto a la práctica. Arranca Xcode para crear un nuevo proyecto. Selecciona Cocoa Application. Dale un nombre a tu proyecto, como "Mi primera apli" (por convención, el nombre de una aplicación con GUI debería comenzar por mayúscula). En la parte izquierda, en la sección Groups & Files, abre la carpeta Resources y haz doble-click en MainMenu.xib.

13 Xcode Nib

Haz doble-click en el fichero MainMenu.xib de Xcode

Si estás usando una versión anterior a Xcode 3, verás que el nombre del fichero será nib en lugar de xib. No tiene importancia ya que los ficheros son iguales a todos los efectos.

Creación de la GUI (Interfaz gráfica de usuario)

Al abrir el fichero MainMenu.xib se abrirá otro programa, Interface Builder (traducido como Generador de Interfaces). Ya que van a aparecer muchas ventanas, podría interesarte seleccionar la opción Hide Others (Ocultar el resto de ventanas) del menú Interface Builder. Una de las ventanas tiene en el título el nombre que has dado a tu proyecto y no tiene contenido: es la que verán los usuarios de tu aplicación. Si la ves demasiado grande puedes redimensionarla. Verás también otra ventana que se llama "Library": es una especie de repositorio de todos los tipos de objetos que puedes tener en tu GUI. Selecciona el elemento "Objects" en la parte superior de la ventana y desplázate por la lista hasta encontrar los botones (Push Button). Arrastra dos botones a tu ventana de aplicación, uno cada vez. Sigue desplazándote más abajo en la lista de objetos hasta encontrar uno con el texto "Label" y arrastra uno de estos objetos a tu ventana.

Podemos modificar el modo de presentación de los objetos en la ventana "Library" pulsando el pequeño botón con una rueda dentada que hay en la parte inferior de la ventana: desde ver sólo los iconos, hasta que se incluya la descripción al lado de cada objeto.

14 Create Gui

Arrastrando objetos de la ventana "Library" hasta la ventana de tu aplicación.

Internamente, al arrastrar los objetos de la ventana "Library" a la ventana de aplicación, se crean esos objetos y se colocan en la ventana.

Fíjate que al hacer click sobre los objetos de la ventana "Library", en la parte inferior aparece un nombre descriptivo, como "Push Button" y debajo otro nombre como NSButton. Este último es el nombre de clase que proporciona Apple. Más tarde en este capítulo veremos como encontrar los métodos que nos ofrecen estas clases, los cuales nos harán falta para realizar las acciones necesarias en nuestro programa.

No olvides guardar el fichero regularmente (File -> Save) para que Interface Builder y Xcode se mantengan sincronizados.

Recoloca los objetos en tu ventana de aplicación para que queden con buen aspecto: arrástralos y redimensiónalos a tu gusto. Puedes cambiar el texto de los botones haciendo doble-click sobre él. Es conveniente que explores la paleta de objetos y practiques a añadir otros objetos a tu ventana.

Conociendo Interface Builder

Para cambiar las propiedades de un objeto, selecciónalo y pulsa Cmd-Shift-I. Por ejemplo selecciona tu ventana de aplicación, pulsando en la barra de título superior de la ventana, y pulsa Cmd-Shift-I. Verás una ventana titulada "Window Attributes". Puedes, por ejemplo, marcar la casilla "Textured" y tu ventana cambiará a un aspecto metálico. Experimenta seleccionando los botones y el campo de texto: ¡puedes modificar un montón de propiedades de tu aplicación sin escribir una sola línea de código!

15 Explore Ib

Nuestra ventana en Interface Builder, junto al inspector de objetos

Trabajando con clases

Cierra Interface Builder y volvamos ahora a Xcode. En la ventana de proyecto, abre la carpeta Classes en el panel Groups & Files. Verás dos ficheros, que son la clase básica que Xcode ha creado para nosotros. El fichero terminado en ".h" es la cabecera (Header) con la interfaz de la clase; el que termina en ".m" es el fichero principal (Main) con la implementación del código de la clase.

16 App Delegate

La clase Application Delegate que se incluye con cada aplicación Cocoa.

Cada aplicación Cocoa necesita al menos una clase para poder realizar algo útil. Por convenio a la clase básica se la conoce como Delegada (Delegate), porque puede implementar una serie de métodos delegados para personalizar el comportamiento de la clase NSApplication de Cocoa. Veremos esto más tarde.

Las clases a fondo

Veamos como funcionan las clases.

Para ahorrar esfuerzo de programación, sería bueno que pudiésemos construir encima de lo que otros ya han hecho, en lugar de empezar a escribir desde cero. Si, por ejemplo, queremos crear una ventana con unas propiedades especiales, sólo deberíamos necesitar añadir el código para esas propiedades y no tener que escribir el código para el resto del comportamiento de la ventana, como minimizar o cerrar. Para construir encima de lo que otros programadores han hecho, heredaremos todo ese comportamiento. Y eso es lo que hace a Objective-C tan diferente de C.

¿Cómo se hace? Bien, tenemos una clase ventana (NSWindow), y nosotros podríamos escribir una clase propia que herede de esa. Supongamos que añadimos una característica adicional a nuestra clase. ¿Qué ocurre cuando recibe un mensaje "close"? Nosotros no hemos escrito código para eso, y tampoco lo hemos copiado de ningún sitio. Es sencillo, si la clase no contiene el código para un método en particular, el mensaje se transfiere automáticamente a la clase desde la que hemos heredado (conocida como su "superclase") y si ahí tampoco lo encontrase continuaría buscándolo ascendiendo en la jerarquía de herencia.

Si no se encuentra el método, hemos recibido un mensaje que no podemos gestionar. Es como ir a un taller de coches para que nos arreglen la lavadora. No nos puede ayudar ni siquiera el jefe del taller. En estos casos Objective-C lanzará un error.

Personalización de clases

¿Qué ocurre si queremos implementar un comportamiento distinto para un método que ya existe en la superclase? Es sencillo, podemos sobreescribir métodos. Por ejemplo, podríamos escribir código para que cuando se pulse el botón para cerrar la ventana, que la mueva hacia fuera de la pantalla antes de cerrarla. Nuestra clase especial usará el mismo nombre de método que la clase que definió Apple así que, cuando le llegue el mensaje de cerrar, se ejecutará nuestro código y no el de Apple. Por tanto ahora la ventana saldrá fuera de la vista antes de cerrarse realmente.

Pero veamos, el código para cerrar la ventana ya lo ha programado Apple, así que desde nuestro método de cerrar ventana podríamos invocar el método de nuestra superclase. Veamos como hacerlo:

//[2]
- (void) close:(id)sender {
    // Aquí escribiríamos el código para desplazar la ventana fuera de la pantalla.
    [super close]; // Esto invoca el método "close" de la superclase.
}

Una clase para gobernarlas a todas

La clase que está por encima de todas en la jerarquía de clases es la llamada NSObject. Así que todas clases que nosotros podamos crear o usar van a ser subclases de NSObject, directa o indirectamente. Por ejemplo la clase NSWindow es una subclase de NSResponder, que a su vez es subclase de NSObject. La clase NSObject define los métodos comunes a todos los objetos (por ejemplo, crear una descripción textual del propio objeto, preguntar si el objeto es capaz de entender un mensaje dado, etc.)

Antes de aburrirte con demasiada teoría veamos como crear una clase.

Creación de una clase

Dentro de nuestro proyecto Xcode seleccionaremos New File dentro del menú File. Seleccionaremos Objective-C Class y subclass of NSObject. Pulsaremos el botón Next. Llamaremos a la clase "MPAClaseEjemplo". Pulsa el botón Finish.

16 Subclass MFAExampleClass

Creación de la clase MPAClaseEjemplo

Después de pulsar Finish verás dos ficheros nuevos en la carpeta Classes del panel Groups & Files: MPAClaseEjemplo.h y MPAClaseEjemplo.m; si las seleccionas podrás ver su contenido en el editor. En este momento tienen sólo un esqueleto básico. Recuerda que esta clase la creamos para que reciba los mensajes de los botones y envíe también mensajes al campo de texto. Vamos a hacer que Interface Builder nos ayude a generar el código.

Las primeras 3 letras de MPAClaseEjemplo vienen de la abreviatura de Mi primera aplicación. Puedes poner a las clases el nombre que quieras. Pero existe el convenio de que las clases empiecen por una o varias letras mayúsculas y no pueden contener espacios. Recomendamos que cuando empieces a escribir tus propias aplicaciones elijas 2 o 3 letras mayúsculas para usar como prefijo en el nombre de tus propias clases. Esto evitará confusiones con las clases existentes. Por ejemplo, no deberías usar NS, que está reservado para las clases de Apple (NS viene de NeXTStep, que es el sistema operativo en el que se basó Mac OSX cuando Apple compró la compañía NeXT.

El wiki CocaDev mantiene la lista de prefijos que ya se están usando y, por tanto, deberíamos evitar. Compruébala antes de elegir tu propio prefijo: http://www.cocoadev.com/index.pl?ChooseYourOwnPrefix.

Cuando se crean clases nuevas debemos elegir un nombre adecuado que proporcione información sobre la clase. Por ejemplo, ya hemos visto que la clase de Cocoa que representa las ventanas se llama NSWindow. Otro ejemplo podría ser la clase que representa colores, llamada NSColor. En nuestro caso, la clase MPAClaseEjemplo que estamos creando solamente va a ilustrar el sistema por el que los objetos se comunican entre ellos en una aplicación. Por eso le damos un nombre genérico sin significado especial.

Creación de una instancia en Interface Builder

Vuelve a Interface Builder (recuerda que lo abriremos haciendo doble-click en MainMenu.xib). En la ventana Library abre el desplegable superior y selecciona Objects & Controllers. Después arrastra un Object (tiene el icono de un cubo azul) hasta la clase MainMenu.xib.

18 Instantiate

Instanciando un nuevo objeto

Después selecciona el botón Identity de la ventana Inspector (Cmd-6) y en la sección Class Identity, en el desplegable Class selecciona MPAClaseEjemplo. De esta forma instanciaremos nuestra clase MPAClaseEjemplo dentro del fichero xib. Esto permitirá la comunicación entre nuestro código y la interfaz.

19 Identity

Asignando la identidad a nuestro objeto

Creación de conexiones

Nuestro primer paso va a ser crear conexiones entre los botones (que envían mensajes) hacia nuestra clase MPAClaseEjemplo. Además, crearemos conexiones desde nuestra clase hacia el campo de texto, porque vamos a querer enviar mensajes a ese componente. Para poder enviar mensajes de un objeto a otro, el primero ha de tener una referencia al segundo, y eso es lo que conseguiremos creando una conexión.

Veamos lo que queremos que haga la aplicación. Al pulsarse cada botón, tiene que enviar un mensaje. Este mensaje contendrá el nombre del método de la clase MPAClaseEjemplo que queremos que se ejecute. El mensaje se enviará a la instancia de la clase MPAClaseEjemplo que acabamos de crear, es decir, un objeto MPAClaseEjemplo. (Recordemos que las instancias no contienen el código, lo tienen las clases). Por lo tanto el mensaje que llega al objeto MPAClaseEjemplo dispara un método en la clase MPAClaseEjemplo que hará alguna cosa: en nuestro caso, enviar a su vez un mensaje al campo de texto que creamos en nuestra ventana de aplicación. Al igual que todo mensaje, éste consiste en el nombre de un método (que tendrá que ejecutar el campo de texto). En este caso, el método consiste en mostrar un valor, y ese valor será también parte del mensaje (es, por tanto, un "argumento"; ¿recuerdas el concepto?).

Nuestra clase necesita dos acciones (métodos) que serán llamadas por los objetos botón. Nuestra clase también necesita un Outlet: una variable para recordar el objeto al que se le va a enviar el mensaje (el campo de texto).

En la ventana Library selecciona, en la parte superior, la pestaña Classes. Esto te mostrará todas las clases y sus atributos del Framework de Cocoa. En la parte inferior de la ventana hay un campo de búsqueda: comienza a escribir en él el nombre de tu clase (MPAClaseEjemplo) y la verás aparecer en el primer panel. El aspecto con el que aparece la clase puede ser distinto en tu ventana. Recuerda que se puede personalizar en el botón de rueda dentada de la parte inferior: aquí está activa la opción "View icons and descriptions".

18 Add Actions

La clase MPAClaseEjemplo en la librería de clases

Ahora, en la pestaña Actions, haz click en el botón con el signo (+) para añadir una acción (es decir, un método de acción) a la clase MPAClaseEjemplo. Modifica el nombre que aparece por defecto por otro que tenga más sentido (por ejemplo, puedes poner "asignarValor5:", ya que en este método haremos que se muestre el número 5 en el campo de texto). Añade también otro método y dale el nombre "anular:", ya que en este método asignaremos un 0 al campo de texto. Fíjate que el nombre de los métodos siempre termina en dos puntos (":"). Lo explicaremos después.

18 Add Actions

Creación de métodos en nuestra clase MPAClaseEjemplo

Ahora selecciona la pestaña Outlets, pulsa el botón con el signo (+) para añadir un outlet y dale un nombre, por ejemplo "campoDeTexto".

18 Add Actions

Creación de un outlet en la clase MPAClaseEjemplo

Antes de crear las conexiones entre objetos, vamos a darle nombres con sentido a nuestros botones. Por ejemplo, ya que el primero va a hacer que se muestre el valor 5 en el campo de texto, lo vamos a llamar "Asigna valor 5" (recordemos que para cambiar el nombre, la forma más sencilla es hacer doble-click y escribir el nuevo nombre). De la misma forma, al segundo botón lo llamaremos "Anular". De todas formas ten en cuenta que lo que acabamos de hacer sólo cumple una función estética y no es estrictamente necesario para que el programa funcione. Pero debemos hacerlo para que el programa sea lo más descriptivo posible al usuario final.

Ahora estamos listos para crear las conexiones entre:

  1. El botón "Anular" y la instancia de MPAClaseEjemplo
  2. El botón "Asigna valor 5" y la instancia de MPAClaseEjemplo
  3. La instancia de MPAClaseEjemplo y el campo de texto.

Para crear las conexiones, presiona en el teclado la tecla Ctrl y arrastra el ratón desde el botón "Asigna valor 5" hasta la instancia de MPAClaseEjemplo en la ventana MainMenu.xib (¡asegúrate de hacerlo en ese sentido y no desde la instancia hacia el botón!). Mientras nos desplazamos verás una línea que se dibuja. Soltaremos el ratón encima de la instancia y se desplegará un menú con las acciones que puede recibir la clase. Ahí seleccionaremos "asignarValor5:".

20 Connect

Estableciendo la conexión

Ahora el botón mantiene una referencia hacia nuestro objeto MPAClaseEjemplo y le enviará el mensaje asignarValor5: cuando sea pulsado.

Conecta ahora el botón "Anular" siguiendo el mismo proceso (en el menú que aparece cuando sueltas el ratón encima del objeto MPAClaseEjemplo deberás seleccionar "anular:").

Para crear la conexión entre MPAClaseEjemplo y el campo de texto, pulsa la tecla Ctrl y empieza a arrastrar desde el objeto MPAClaseEjemplo y suelta el ratón encima del campo de texto. En el menú que se despliega selecciona "campoDeTexto" (o el nombre que hayas escogido para el outlet).

¿Para qué ha servido todo esto? Bien, en un momento veremos cómo se creará código sin que hayamos tenido que escribir ni una sola línea.

Generación del código

Asegúrate de que en la ventana MainMenu.xib está seleccionada nuestra clase MPAClaseEjemplo. Ve al menú File en Interface Builder y selecciona Write Class Files. Interface Builder preguntará dónde quieres que guarde los ficheros que se van a crear. No modifiques las opciones que aparecen por defecto, pulsa el botón Save y en la siguiente ventana pulsa Replace.

23 Code

Si vas ahora a Xcode, en la ventana de proyecto deberías ver los ficheros de tu clase en el grupo Classes. Si estuvieran en el grupo Resources o en otro diferente, basta con que selecciones los dos archivos y los arrastres al grupo Classes. Ahora selecciona el fichero .h de tu clase para verlo en el editor.

23 Code

Vemos en nuestro proyecto Xcode los ficheros generados

Retrocedamos por un momento al capítulo 3, en el que hablamos de las funciones. ¿Recuerdas la cabecera de la función, como la que vemos en [11.1]? Es una especie de aviso para el compilador sobre lo que puede esperarse de la función. De los dos ficheros generados, uno tiene la extensión .h, indicando que es un fichero de cabecera (header en inglés): contiene información sobre la clase. Por ejemplo, verás que hay una línea [3.3] que contiene NSObject, lo que quiere decir que nuestra clase hereda de la clase NSObject.

//[3]
//  MPAClaseEjemplo.h
#import <Cocoa/Cocoa.h>  // [3.2]
@interface MPAClaseEjemplo : NSObject {  // [3.3]
    IBOutlet id campoDeTexto; // [3.4]
}
- (IBAction)anular:(id)sender; // [3.6]
- (IBAction)asignarValor5:(id)sender; // [3.7]
@end
 

Verás que hay un outlet [3.4] que apunta al objeto campo de texto. id indica objeto. "IB" se refiere a Interface Builder, el programa que hemos usado para crear este código.

IBAction [3.6, 3.7] es equivalente a void. No se devuelve nada al objeto que envía un mensaje: los botones de nuestro programa no obtienen una respuesta de nuestro objeto MPAClaseEjemplo al que envían su mensaje.

Verás también que hay dos acciones de Interface Builder (IBAction). Son dos métodos de nuestra clase. Los métodos son bastante parecidos a las funciones pero hay algunas diferencias que veremos más adelante.

Anteriormente hemos visto #import <Foundation/Foundation.h> en lugar de la línea [3.2]. La primera (Foundation) es para aplicaciones de consola (sin interfaz gráfica) y ésta (Cocoa) es para aplicaciones con GUI (Interfaz Gráfica de Usuario).

Ahora comprobemos el segundo fichero, el que tiene la extensión .m

//[4]
//  MPAClaseEjemplo.m
#import "MPAClaseEjemplo.h"  // [4.2]
@implementation MPAClaseEjemplo
- (IBAction)anular:(id)sender {  //[4.4]
}
- (IBAction)asignarValor5:(id)sender {
}
@end
 

Antes de nada, vemos que hay una instrucción [4.2] para importar el fichero de cabecera. Podemos reconocer dos métodos: anular: and asignarValor5:. Esos son los métodos de nuestra clase. Se parecen a las funciones en que su código debe escribirse entre llaves. En nuestra aplicación, cuando se presiona un botón, éste envía un mensaje al objeto MPAClaseEjemplo, requiriendo la ejecución de uno de los métodos. No hemos tenido que escribir código para ese comportamiento, sólo hemos tenido que crear las conexiones en Interface Builder. Pero ahora tenemos que implementar los dos métodos, es decir, escribir el código que queremos que se ejecute dentro de cada uno. En nuestro caso queremos que envíen un mensaje al campo de texto, lo que conseguiremos escribiendo las líneas [5.4, 5.7].

//[5]
#import "MPAClaseEjemplo.h"
@implementation MPAClaseEjemplo
- (IBAction)anular:(id)sender {
    [campoDeTexto setIntValue:0];  // [5.4]
}
- (IBAction)asignarValor5:(id)sender {
    [campoDeTexto setIntValue:5];  // [5.7]
}
@end
 

Recomendamos volver un instante al comienzo de esta lección, donde en [1] veíamos el formato de las instrucciones para enviar mensajes. Como puedes ver, enviamos un mensaje al objeto referido en el outlet campoDeTexto. Al haber conectado mediante Interface Builder este outlet con el campo de texto, el mensaje se enviará al objeto correcto. El mensaje contiene el nombre de un método, setIntValue:, junto a un valor numérico entero. El método setIntValue: tiene la capacidad de mostrar un valor entero en un objeto de campo de texto. En el siguiente capítulo veremos como hemos averiguado la información sobre este método.

Listo para despegar

Ahora lo tienes todo listo para compilar tu aplicación y ejecutarla. Como ya sabes, pulsa el botón Build and Run. Xcode tardará unos segundos en compilar la aplicación y después la ejecutará: aparecerá la ventana de tu aplicación y podrás probarla.
23 Run

Nuestra aplicación funcionando

Hemos creado con unos pocos pasos una aplicación (eso sí, muy básica), en la que sólo hemos tenido que escribir dos líneas de código

Post new comment

The content of this field is kept private and will not be shown publicly.
Enter the code shown in the image:

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
11 + 3 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.

Donate!





If you like what you find here and wish to support further development of this site, please donate via PayPal. No account required.

Syndicate

Syndicate content

User login

CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
5 + 1 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.
Enter the code shown in the image: