« Junio 2005 | Inicio | Agosto 2005 »

Julio 25, 2005

[Cocoa] Ejemplo de utilizaciÛn de NSSlider

NSSlider es una de las subclases de NSControl. Es una de las clases finales de la cadena de herencia de los controles, como NSButton o NSTextField, que son las tres clases que utlizaremos en este ejemplo.

CadenaHerenciaNSSlider.jpg

NSSlider implementa mÈtodos para asignar y obtener su valor, su valor m·ximo y mÌnimo, y puede ejecutar una acciÛn de forma continua cuando su valor cambia, o cuando el usuario suelta el ratÛn. Puede tener marcadores, y su valor puede cambiar de forma continua o discreta ( entre los marcadores ).

Slider_inspector.jpg

Para nuestro ejemplo, vamos a construir una aplicaciÛn muy simple, que permitir· ver cÛmo utilizar este control. Si quieres leer un tutorial m·s completo sobre cÛmo utilizar XCode y el Interface Builder para desarrollar aplicaciones, puedes ver un post anterior aquÌ.

Para empezar, veamos el resultado final. El usuario podr· arrastrar el slider, y su valor se mostrar· como texto. TambiÈn habr· un botÛn de "reset".

SlideratWork.jpg

°A trabajar!. Abre XCode, crea un nuevo proyecto ( aplicaciÛn Cocoa ). Una vez creados los ficheros, haz doble click en MainMenu.nib para abrir el Interface Builder, y constrye el interfaz.

A continuaciÛn, selecciona el panel Classes en la ventana MainMenu.nib, y crea una subclase de NSObject. Ll·mala AppController.

Ahora, crea dos outlers. Llama al primero outputTextField, y hazlo de tipo NSTextField. Llama al segundo slider y tipÈalo como NSSlider. Necesitaremos estos dos outlets porque tendremos que poder manipular el valor de ambos controles.

SliderOutlets.jpgSliderActions.jpg

Ahora crea dos acciones: reset y slide. Reset se ejecutar· cuando el usuario haga click en el botÛn "reset", y slide se ejecutar· cuando el usuario arrastre el slider.

Recordemos, la cadena de eventos ser· la siguiente: el usuario arrastra el slider, se ejecuta la acciÛn "slide", y por tanto el controllador recibe notificaciÛn de ese cambio, entonces el controlador obtiene el valor del slider, construye la cadena de texto a mostrar, y asigna el valor del outputTextField. Cuando el usuario haga click en el botÛn "reset", el controlador recibe notificaciÛn a travÈs de la acciÛn "reset", y asigna el valor del slider a su valor inicial, mientras actualiza el NSTextField. øF·cil, no?.

Bueno, pues ya hemos creado los outlets y actions, pero no es suficiente. Ahora tenemos que unirlo todo. Para ello, lo primero es crear los ficheros de la clase AppController ( men˙ Classes-> Create files for AppController ) y la instancia de la clase ( Classes -> Instantiate AppController ).

Ahora, ve al panel de Instances. Vamos a crear las relaciones entre el controlador y el interfaz. Para ello, tendremos que hacer Ctrl+Drag de un elemento al otro. øCÛmo?. øRecuerdas AppController?. TenÌa dos outlets. Uno de ellos era "outputTextField". …sa es la variable de instancia de la clase AppController que apunta al NSTextField del interfaz. Para relacionarlos, haz ctrl+drag desde el controlador al elemento del interfaz. Dicho de otra forma, haz ctrl+drag desde el elemento que necesita saber al elemento que sabe.

Cuando sueltes el ratÛn, selecciona en el Inspector outputTextField y haz click en "connect". Haz lo mismo con "slider" y NSSlider.

Para relacionar las acciones de los elementos del interfaz con el controlador, ctrl+drag desde los controles del interfaz a la instancia de AppController. Selecciona la acciÛn que corresponda, y haz click en "connect".

Salva el fichero nib. Ya hemos acabado con el interfaz. Ahora, vuelve a la ventana del proyecto, y edita el fichero AppController.h

SÛlo tendremos que aÒadir dos cosas a la cabecera de AppController. En primer lugar, necesitamos guardar el valor inicial del slider, para que luego lo podamos resetear. Para ello nos vamos a servir de una variable de clase ( por ejemplo initValue ). TambiÈn tendremos que crear un NSString para actualizar el NSTextField ( algo del tipo "Valor: 25" ). Encapsularemos la creaciÛn de esa cadena en otro mÈtodo, llamado buildFeedbackString.

Por tanto, la cabecera de AppController ser·:

#import @interface AppController : NSObject { IBOutlet NSTextField *outputTextField; IBOutlet NSSlider *slider; float initValue; } - ( IBAction ) slide: ( id ) sender; - ( IBAction ) reset: ( id ) sender; - ( NSString * ) buildFeedbackString: ( float ) value; @end

Ahora, pasemos a la implementaciÛn, comenzando con el mÈtodo buildFeedbackString:

-( NSString * ) buildFeedbackString: ( float ) value { return [ NSString stringWithFormat: @"Value: %.1f", value ]; }

Mostraremos el valor del slider sÛlo con una posiciÛn decimal, Por eso @"%.1f". Si quieres ver la diferencia, prueba con @"Valor: %f".

Ahora, toca implementar el mÈtodo slide. Recogeremos el valor del slider, lo aÒadiremos al Log de la aplicaciÛn ( por si necesit·ramos debugear algo ), y actualizaremos el valor del NSTextfield con la cadena de texto que generemos para ese valor:

- (IBAction)slide:(id)sender { float sliderValue = [ slider floatValue ]; NSLog( @"float value %f", sliderValue ); [ outputTextField setStringValue: [ self buildFeedbackString: sliderValue ] ]; }

Cuando el usuario haga click en el botÛn reset, se ejecutar· el mÈtodo "reset". Este mÈtodo tendr· que asignar al slider su valor incial, y tambiÈn actualizar el valor del NSTextField:

- ( IBAction ) reset: ( id ) sender { [ slider setFloatValue: initValue ]; [ outputTextField setStringValue: [ self buildFeedbackString: initValue ] ]; }

Ya casi hemos terminado. SÛlo falta un pequeÒo detalle. El NSTextField no tiene un valor inicial. Voy a asignar ese valor cuando se cree el interfaz, y lo harÈ utilizando el siguiente mÈtodo:

-( void ) awakeFromNib { initValue = [ slider floatValue ]; [ outputTextField setStringValue: @"Drag" ]; }

Y eso es todo. Haz click en Build and Go, y prueba la aplicaciÛn.

Descarga el cÛdigo fuente ( necesitas XCode 2.1 ).

Julio 20, 2005

Apple abandona Java

Como titular no est· mal, aunque no sea del todo exacto, pero lo cierto es que en la ˙ltima actualizaciÛn de la documentaciÛn de la ADC, se remarca que las features que se aÒadan a Cocoa a partir de la versiÛn 10.4 de Mac OSX no se aÒadir·n en el interfaz Java.

Hasta ahora, se podÌan desarrollar ( al menos en teorÌa, en la pr·ctica era otra cosa ) aplicaciones Cocoa tanto en Java como en Objective-C. A partir de este momento, las novedades que se vayan aÒadiendo al framework sÛlo se har·n para Objective-C, y no para Java.

La documentaciÛn lo dice mucho m·s claro: "you should develop Cocoa applications using Objective-C to take advantage of existing and upcoming Cocoa features". Punto pelota.

El link directo al documento de Apple: aquÌ

VÌa OSNews

Julio 08, 2005

Bocados de realidad

Fases de todo proyecto ( post original en Microsiervos ).

Desgraciadamente, raro es el proyecto en el que no se pasa por casi todas las frases descritas. Mis favoritas, el "castigo ejemplar a los inocentes", y sobre todo "condecoraciones y premios a los no participantes".