Tutorial Simple de Cocoa
De Mono Hispano
Traducido por Juan Baixauli (juan at entiak.com)
Autor original Tim Davis (binary.god at gmail.com)
Contents |
Nota del traductor
El autor original de este tutorial es binary god, del que se ha obtenido el permiso para realizar la traducción que estás leyendo en estos momentos. La versión original de este texto se encuentra en la web de Cocoa#
Suposiciones
En este tutorial voy a suponer que tienes instalado OS X, Mono 1.1.8.1, Cocoa# y el Apple Developer Tools. Además también supondré que no tienes experiencia previa en el uso de Cocoa# ni en las Apple Tools. Hace tan solo 2 meses que cambié de Windows a Apple, y sé lo duro de este cambio ;)
Archivos del proyecto
Descarga por cortesía de renaud.
Empezando
Construyendo el NIB
La primera cosa a hacer es crear el fichero NIB para utilizarlo con la aplicación. Un fichero NIB es mucho más sencillo de utilizar que crear toda la ventana y los controles a través del código.
- Ve a HD Macintosh/Developer/Applications y ejecuta "Interface Builder".
- Crea una nueva aplicación Cocoa.
- Arrastra un "NSButton" y un "NSTextField" desde la ventana de controles a la ventana vacía que se está mostrando en pantalla.
- En la ventana pequeña (normalmente abajo a la izquierda) con 5 pestañas tituladas: Instances, Classes, Images, Sounds y Nibs. Selecciona la pestaña "Classes".
- Haz scroll hacia la izquierda hasta el final, haz ctrl+click sobre "NSObject" y selecciona "SubClass NSObject".
- Llama al nuevo objeto "ApplicationController".
- Haz ctrl+click sobre "ApplicationController" y selecciona "Instantiate ApplicationController". Esto hará que la pestaña "Instances" se seleccione. Ahora deberías ver un cubo azul llamado "ApplicationController".
- Selecciona la pestaña "Classes" de nuevo, busca "ApplicationController" y haz ctrl+click sobre el objeto. Selecciona "Add outlet".
- Esto hará que la ventana "Info Window" sea visible (si no lo era antes). Añade un nuevo outlet llamado "textBox1", y ponle como tipo "NSTextField". Añade otro outlet llamado "mainWindow" y dale como tipo "NSWindow". En la misma ventana selecciona la pestaña "Actions" y añade una acción llamada "buttonClick".
- Vuelve a la pestaña "Instances", mantén presionada la tecla Ctrl y selecciona el objeto "ApplicationController" (a partir de ahora la acción de presionar la tecla Ctrl y seleccionar un objeto le llamaremos Ctrl Click) y arrastra hacia el "NSTextField" que pusiste en la ventana de la aplicación que estamos construyendo. Después de hacer esto, en la ventana "Info Window" deberá aparecer la página de los outlets. Asegúrate de tener seleccionado el outlet "textBox1" y entonces pulsa sobre "Connect".
- Ctrl Click sobre el "NSButton" de la ventana de la aplicación y arrastra hacia el objeto "ApplicationController", selecciona la acción "buttonClick" y pulsa sobre "Connect".
- Ctrl Click sobre "File's Owner" y arrastra hasta "ApplicationController", conecta el outlet "delegate".
- Ctrl Click sobre "ApplicationController" y arrastra hasta el objeto "Window" en la pestaña "Instances", conecta con el outlet "mainWindow".
- Ctrl Click sobre "Window" en la pestaña "Instances" y arrastra hasta "ApplicationController", asigna el outlet "delegate".
Acciones vs. Outlets
Acciones: Las acciones son como los eventos. Al crear una acción en un NIB, la asignamos a un control sobre el que tiene capacidad de actuar.
Nota: También podríamos asignar acciones vía código (ie "button1.accion = buttonClick").
Las acciones se conectan mediante Ctrl Click sobre el elemento de la interfaz y arrastrando hacia el objeto controlador
Outlets:Los outlets son una forma de enlazar objetos del interfaz gráfico con variables del código. Si no enlazas un objeto a un outlet, no vas a poder usarlo desde el código. Es una forma de decirle al código que variable apunta a cada objeto de la interfaz.
Los outlets se conectan mediante Ctrl Click sobre el objeto controlador y arrastrando hacia el elemento de la interfaz
El código
Main.cs
El fichero main.cs es el punto de entrada a la aplicación. Vamos a separar esto de la actual ApplicationController para poder mantener un seguimiento más fácil.
using System;
using System.Runtime.InteropServices;
using Apple.Foundation;
using Apple.AppKit;
class MainClass {
public void Run() {
Console.WriteLine ("initing: {0:x}", (int)Apple.Foundation.Class.Get("NSBundle"));
Application.Init();
Console.WriteLine ("initd");
Application.LoadNib ("Main.nib");
Application.Run();
}
static void Main(string[] args) {
MainClass main = new MainClass();
main.Run();
}
}
Lo más importante a considerar aquí es la línea "Application.LoadNib()". Hay que asegurarse de que estamos cargando el fichero NIB correcto.
ApplicationController.cs
El fichero applicationcontroller.cs es el punto principal para el manejo de la interfaz. Aquí es donde conectamos y definimos todos los elementos de la interfaz gráfica.
using System;
using System.IO;
using System.Collections;
using Apple.Foundation;
using Apple.AppKit;
[Register("ApplicationController")]
public class ApplicationController : NSObject {
[Connect]
public NSTextField textBox1;
[Connect]
public NSWindow mainWindow;
protected ApplicationController(System.IntPtr a, bool b) : base(a, b){}
//Form.Load Event
[Export("applicationWillFinishLaunching:")]
public void FinishLoading(NSNotification aNotification) {
textBox1.stringValue = "Form Loaded";
}
[Export("buttonClick:")]
public void buttonClick(object sender) {
textBox1.stringValue = "Button Pushed";
}
}
Connect/Register
No estoy seguro de la explicación técnica para esto, pero es la parte que conecta la variable definida con el objeto del NIB. En la interfaz podemos tener elementos que no tengan una variable asociada en el código, pero lo que no podemos hacer es conectar variables locales a objetos que no existan en la interfaz. Si hacemos eso haremos que nuestra aplicación no se ejecute correctamente. Para cada elemento de la interfaz al que queramos acceder a través del código, tenemos que crear una nueva variable del tipo adecuado y asegurarnos que usamos la sentencia Connect sobre él.
La sentencia Register al principio de la clase conecta la clase con el "ApplicationController" definido en el fichero NIB.
Export
La etiqueta "Export" es la que enlaza los eventos con las acciones declaradas en el fichero NIB. Puedes asignar estos eventos a los objetos de la interfaz de muchas formas. Puedes hacerlo como dijimos en el tutorial (Ctrl Click y arrastrar) o directamente sobre el código. Hacerlo mediante el fichero NIB es mucho más cómoda, aunque a veces ciertos elementos no se dejan enlazar así.
En el ejemplo puedes ver que he exportado "buttonClick:" a la funcion "buttonClick". El evento "applicationWillFinishLaunching:" se genera automáticamente por la ventana principal de la aplicación. Piensa en él como el evento Form Load en WinForms.
Archivos útiles
He creado dos archivos más para hacerme la vida más sencilla. Un makefile y un archivo de comandos. He creado el archivo de comandos para no tener que mantener abierta una ventana de terminal todo el tiempo.
Makefile
all: test
test: Main.cs
mcs -t:exe -out:SimpleTutorial.exe -pkg:cocoa-sharp *.cs
rm -rf SimpleTutorial.app
macpack -m:2 -n:SimpleTutorial -o:. -a:SimpleTutorial.exe -r:/Library/Frameworks/Mono.framework/Versions/Current/lib/libCocoaSharpGlue.dylib -r:Main.nib
No se mucho de makefiles, pero las partes importantes en este fichero son las que contienen el nombre "SimpleTutorial". Cambia esto a como quieras llamar a tu programa. La opción -pkg en el comando mcs hace que el compilador incluya las librerías de cocoa#. MacPack es la herramienta que crea los paquetes para OS X. Asegúrate de incluir todos los nib/imágenes/iconos/etc como recursos usando la opcion -r de macpack.
Archivo de comandos
Este fichero te permitirá hacer doble click sobre el y que se ejecute automáticamente el comando make. Crea este fichero y guárdalo como <algo>.command
#!/bin/tcsh # if launched from the finder, we'll not be in the correct directory. # get to the directory where this script file lives cd `dirname $0` make
Terminado
Bueno, pues ya deberías haber terminado con la aplicación. Haz doble click sobre el fichero <algo>.command que has creado y deberías ver como todo se compila correctamente. Si todo va bien, deberías ver un icono de una aplicación llamada SimpleTutorial, haz doble click sobre ella y la aplicación se debería ejecutar sin problemas.
Si encuentras algún error ponte en contacto conmigo.

Powered by MediaWiki