[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.
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 ).
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".
°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.
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.