miércoles, 27 de julio de 2011

Métodos privados y "protected" en Objective-C

El lenguaje Objective-C tiene algunas cosas a las que todavía no me termino de acostumbrar, después de más de un año de estar trabajando con él.

Una de estas cosas es la visibilidad de los métodos.

Me explico: en los lenguajes orientados a objetos, se suele tener por lo menos tres tipos de métodos: públicos, que son accesibles por todos; privados, que son solo accesibles dentro de la clase que los define; y "protected" que son visibles para la clase que los define y para sus clases derivadas.

Métodos públicos

En Objective-C todos los métodos son públicos, en el sentido que siempre se pueden ejecutar aunque no estén declarados como tal.

Para declarar un método como público y que quede visible para el resto del mundo, simplemente se declara en la definición de la clase en el .h

Métodos privados

Si bien cualquier método se puede invocar, los que no están declarados en el .h son considerados privados.

Al no declararlos en el .h, no es fácil conocer la firma de estos métodos, por lo que tampoco es fácil invocarlos. Además, si se usa un método privado, el compilador muestra un aviso que puede ser que el objeto no responda a ese método.

Métodos protected

En el lenguaje no hay forma de definir un método como protected. Lo que mejor que se puede hacer, es definirlo como privado, y documentarlo de alguna forma.

El problema es que al definirlo como privado, el compilador va a dar un warning de que no existe el método.

El "work arround" que encontré, es volver a declararlo en una categoría, para que el compilador sepa que existe.

Supongamos que tenemos una clase MySuperClass, que define un método privado
-(void)myProtectedMethod
y que tengo una clase MyDerivedClass que hereda de MySuperClass.

Si quiero usar el método en MyDerivedClass sin que me de un warning, puedo en el archivo MyDerivedClass.m, declarar una categoría para MySuperClass donde defino este método. Suena complicado, el código no lo es tanto.
// MyDerivedClass.m

#import "MyDerivedClass.h"

@interface MySuperClass (Protected)
-(void)myProtectedMethod;
@end


@implementation MyDerivedClass
...
@end

No se si es la mejor opción, pero es efectiva. Por supuesto, si alguien lo resolvió de otra forma, son bienvenidos los comentarios.

sábado, 23 de julio de 2011

Layout Enabled y nuevos controles

En el Night Build del 20 de junio de GeneXus X Evolution 2, aparece una nueva propiedad en el IDE, para los objetos de tipo Work With Smart Devices: Layout Enabled.

Esta propiedad está a nivel del Detail del pattern, e indica como dice su nombre, si se toma en cuenta el layout definido en el objeto (poniéndola en true), o si se dibuja un campo debajo de otro como se hacía hasta el momento (dejándola en false que por ahora es el valor por defecto).

Además de respetar el layout definido en el objeto, permite usar controles que antes no estaban disponibles.

Estos son algunas de las cosas en las que estuve trabajando y ahora quedan visibles.

Tab control

El Tab control permite agregar componentes en distintos tabs.


En la imagen se ven solo los tabs sin datos, porque fue como me quedó el ejemplo, también se pueden poner datos...

No se si en el último Night Build ya está en el IDE el control tab, pero si no está sale en el próximo...

Wheel control

Permite elegir valores usando una ruedita.

Funciona para enumerados y para campos numéricos, en estos últimos se le dice el rango de valores y el step, es decir, cuanto varía entre cada valor. Si el step es un decimal (por ejemplo 0.1 como en la imagen), se muestra una ruedita para los enteros y otra para los decimales.



Mapas a pantalla completa

En el iPad, se puede hacer que la aplicación se ejecute a pantalla completa (por defecto usa un split view: las listas a la izquierda y los detalles a la derecha). Para que ejecute a pantalla completa, hay que cambiar una propiedad: Navigation Style = Flip.

En este caso, cuando se usa el control SD Maps, se oculta la barra de navegación y la toolbar, quedando el mapa a pantalla completa (esto va a ser opcional mediante una propiedad, hoy es siempre que se pone Flip).


También se ve en la imagen, que cada uno de los marcadores usa una imagen distinta. Esto también es nuevo. Se agregaron dos propiedades para el control SD Maps: Pin Image y Pin Image Attribute. La Pin Image es una imagen estática, y usa para todos los marcadores la misma. El Pin Image Attribute permite poner una imagen distinta para cada marcador.

Sobre el uso de estas funcionalidades

Todas estas cosas van a estar disponibles en todos los generadores, aunque en este momento es posible que solo estén en iOS... así como también hay cosas que solo están en Android o en BlackBerry.

Además en general no van a funcionar con el Knowledge Base Navigator que está en el App Store, porque esa versión está sincronizada con la beta 3 y estos cambios son (pueden ser...) posteriores. Si los quieren usar, van a tener que compilar la aplicación usando una Mac o esperar a la próxima versión del KBN.

También aclaro que esto son solo algunas de las cosas que hay, y en particular son algunas en las que trabajé yo. En los Night Builds hay muchas más cosas, que se anuncian en el wiki.