Translate

lunes, 27 de febrero de 2012

Custom Sheets


En un post anterior veíamos como mostrar mensajes de alert mediante la clase NSAlert. (http://ugeblog.blogspot.com/2012/02/xcode-mensajes-de-aviso.html).
En estos mensajes de alerta podemos mostrar alguna advertencia y pedir confirmación mediante botones, pero en determinados casos podemos querer usar el panel para pedir algún dato adicional al usuario de manera que no se pueda acceder al resto de la aplicación mientras el panel esté desplegado (comportamiento modal). Para ello contamos con el uso de los customs sheets.

In a post before we could see how to show alert messages using the class NSAlert. (http://ugeblog.blogspot.com/2012/02/xcode-mensajes-de-aviso.html).
With those messages we could show any kind of alert requesting a user confirmation using diferentes buttons, but in some cases we need something more like a simple confirmation, for example we could need the user enter some kind of data forbiding the access to the rest of the application until the user complete entering the data required (modal behaviour). For this purpose we have the Custom Sheets.

El ejemplo que vamos a hacer será muy simple y constará de dos ventanas, una principal con un botón que al pulsarlo nos muestra un panel asociado a esta ventana. Este segundo panel se ocultará mediante un botón.

The example application we are going to made is very simple. It wil have two windows, one main window with one button which opens another secondary window.   This secondary Windows opens from the first one so we can´t do anything in the application without clossing the last window opened.



En los ejemplos de Apple e incluso en la documentación de cómo manejar Custom Sheets se nos dice que para ello implementemos el panel en su propio fichero .nib y que llamemos a su creación desde el código, pero…¿porque complicarnos la vida pudiéndolo hacer simple?. La idea que proponen es crear un fichero .nib (o .xib) para cada ventana, crear un controlador para cada ventana, realizar las correspondientes declaraciones de cada clase de manera que cada una conozca a la otra y una vez así hacer la llamada al panel desde la ventana principal. Un poco liante… yo prefiero hacerlo fácil, y para ello lo mejor es definir el panel dentro del fichero nib de la propia ventana que necesita mostrar el panel.

In the Apple example and also in the documentation which explain the uses of customs sheets, we could see they uses an independent .nib file for define the second panel, but… why not made it easy?, in my opinion is more easy and clear to implementate the second panel in the same .nib file the main window has. The other way is to create a .nib file for each window/panel, and of course his own class controller. Also you would need to declare each class inside the other, on the way any window could “see” the others windows it must use. To much complicated, too many files, declarations, and so on,…a prefer to simplify it.

Comenzaremos creando por lo tanto un aplicación con una única ventana de entrada que llamaremos Main Window.  A esta ventana le añadiremos un botón que posteriormente nos servirá para mostrar el panel.

El siguiente paso es crear el panel, y para ello en el Object Library buscaremos un objeto del tipo panel o del tipo HUD Window y lo arrastramos sobre el fichero .xib que posee la ventana. Igualmente le ponemos un botón que luego servirá para ocultar el panel,. Por ultimo y para evitar que se muestre el panel al iniciar desmarcaremos la casilla Visible at Launch. Debería quedar de la siguiente manera:

We will start creating a new Project with one main window, with one button used to opening the panel. Also we must créate the panel, and for this, we need to search into the Object Library for a Panel, o for a HUD Window, drag inside the nib file near the main window. Also we need another button inside the panel to close it. Is important to unmark the Visible At Launch option of the panel to avoid the panel to be shown at the startup of the application.



Una vez creadas la ventana principal y el panel crearemos unOutlet del panel y dos action, uno desde cada botón llamados mostratPanel y cerrarPanel. Tanto el Outlet del panel como los Action se crearan en el fichero AppDelegate de la ventana principal, donde encontraremos un Outlet a la ventana principal. El fichero AppDelegate.h debería quedar algo así:

Once we have created both the window and the panel, we must créate one Outlet for the panel and to Actions, one for the button in the main window, and another for the button in the panel. This Outlet and Actions must be created into the AppDelegate.h file wich control the main Window. This AppDelegate.h file must appears as follows:



Finalmente implementaremos el código que sirve para mostrar y cerrar el panel en el fichero Appdelegate.m, el cual debería quedar de la siguiente manera:

Finally we must type the code to show and to closet the panel. Both methods must be implementated into the AppDelegate.m file inside the Actions we defined previously. It must appears as follows:



Y eso es todo, seguimos aprendiendo …
And this is it,…. keep going in the XCode/Cocoa learning…


No hay comentarios: