viernes, 11 de abril de 2014

Disparo de eventos desde un User Control GeneXus en iOS

Los User Controls en GeneXus permiten extender la funcionalidad provista por los generadores, para resolver escenarios de User Interface que no están resueltos en los controles estandar. Hay varios controles interesantes en el Marketplace, principalmente para Web pero también para Smart Devices.

Si bien estos User Controls se utilizan mayormente para cambiar el aspecto visual de las aplicaciones, puede haber casos donde sea necesario ejecutar código del usuario.

En iOS esto es muy fácil de hacer, si la implementación del control hereda de la clase GXControlBase o alguna de sus clases derivadas.

Hay dos forma de hacerlo: disparando una acción del panel o disparando un evento del control.

Disparar una acción del panel

Para disparar una acción definida en el panel donde se encuentra el User Control, alcanza con incluir el siguiente código:
[self fireActionWithName:actionName userInterfaceContext:nil withEntityData:nil];
donde self es la implementación del user control y actionName es el nombre del evento como se definió en GeneXus.

Para poder disparar esta acción, obviamente necesitamos conocer el nombre de la misma. Puede ser fijo (y estar documentado...) o se puede configurar en una propiedad.

Disparar un evento del control

Otra forma de hacerlo es definiendo un evento en el User Control.

Para esto, debemos indicar en la definición del control que define un evento. Esto se hace en el archivo .control, y la forma de hacerlo es muy simple:
<Events>
    <Event>NombreDelEvento</Event>
</Events>
Luego, en el código GeneXus, podemos escribir:
Event Control.NombreDelEvento
    ...
EndEvent
Para dispararlo desde el código Objective-C, también en este caso es una línea
[self fireControlEvent:@"NombreDelEvento" userInterfaceContext:nil withEntityData:nil];
Un ejemplo de esto último lo pueden ver en el control SD Paged Grid, que define un evento PageChanged.

Si bien las dos opciones son equivalentes en cuanto a funcionalidad, creo que es mejor la segunda porque queda más fácil de entender el código GeneXus y facilita al usuario la posibilidad de encontrar esta funcionalidad de nuestro control.