Posterous theme by Cory Watilo

Filed under: cocoa

Guardando los ajustes con la clase NSUserDefaults

Moz-screenshot-1
Cuando queremos guardar los ajustes de nuestra aplicación, podemos usar NSUserDefaults que hace que nuestra vida sea mucho más facil cuando nos proponemos este objetivo. La aplicación que vamos a construir como un ejemplo es un control segmentado que recordará qué botón seleccionamos la última vez que ejecutamos la aplicación en cuestión.

La clase NSUserDefaults trabaja como un diccionario. Para un key dado, puedes proveer algunos tipos primitivos y algunos tipos de objetos como por ejemplo: NSData, NSString, NSNumber, NSDate, NSArray, o NSDictionary. Estos valores se guardarán en una base de datos y serán guardados en la caché para incrementar el rendimiento de la aplicación si se les invoca con frecuencia.

Estos datos  se guardarán periódicamente a disco, aunque sin embargo tendrás que llamar manualmente a la sincronización cuando la aplicación está apunto de salir.

En la aplicación de ejemplo, añadir un UISegmentedControl es bastante sencillo con lo que te dejamos eso a tu cargo. Lo que pretendemos cubrir en este tutorial es como actualizar la base de datos cuando la selección ha cambiado y como establecer el index cuando la aplicación se ejecute. Primero capturaremos el evento cuando el índice cambie y lo guardaremos

 - (IBAction)selectionChanged:(id)sender {
   NSInteger index = ((UISegmentedControl*)sender).selectedSegmentIndex;
   
   // Get the shared defaults object.
   NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
   
   // Save the index.
   [settings setInteger:index forKey:@"MySelectedValueKey"];
   
   // Write them to disk - this is optional here,
   // but should be done when the app exits.
   [settings synchronize];
 } 


Como puedes ver es bastante sencillo guardar cosas. Primero capturo el index seleccionado del UISegmentedControl, y después lo guardo con su correspondiente "key" en "MySelectedValueKey". El key puede ser cualquier cosa que quieras probablemente podría establecerse con un #define. Lo último que hacemos es sincronizar con la base de datos, la cual guarda todos los cambios en el disco. Esto no tiene que hacerse aquí, pero al menos deberías hacerlo cuando la aplicación se termina o arriesgarás que no se guarden tus cambios.

Lo siguiente que tenemos que hacer es establecer el índice seleccionado una vez la app se arranca de nuevo para que se abra como la dejamos por última vez.

 - (BOOL)application:(UIApplication *)application 


didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    


    
   // Override point for customization after application launch.
     
   [self.window makeKeyAndVisible];
   
   // Get the settings and set the selected index.
   NSUserDefaults *settings = [NSUserDefaults standardUserDefaults];
   if([settings objectForKey:@"MySelectedValueKey"] != nil) {
     options.selectedSegmentIndex = [settings integerForKey:@"MySelectedValueKey"];
   }
     
   return YES;
 }
 

NSUserDefaults no tiene una gran manera de saber si un key existe. Como objectForKey devolverá nil si no hay nada allí, me gusta usar este método. Si algo está allí, entonces usamos algo más específico como integerForKey y establecemos el índice seleccionado al valor guardado en la base de datos.


NSUserDefaults doesn't have a great way to see if a key exists. Since objectForKey will return nil if there's nothing there, I like using that method. If something is there, then I use the more specific integerForKey method and set the selected index to the value stored in the database.

 

Core Plot: Gráficas en tus aplicaciones

Normalmente nos encontramos con la necesidad de mostrar algún tipo de gráfico en nuestra aplicación de iOS u OSX. Por esta razón, para casi cualquier lenguaje disponible ahí fuera, siempre hay al menos un tipo de librería de ploteado y gráficos. En el caso de iOS me he encontrado con una librería curiosa y que además es open source, llamada Core Plot Esta librería parece estar bajo desarrollo muy activo y puede usarse para crear distintos tipos de gráficos como por ejemplo los que se pueden ver en está página.

Para conseguir esta librería, necesitaremos instalar el sistema de versiones llamado mercurial de la siguiente manera. Si no lo tenemos instalado, lo descargamos de su web oficial e instalamos el dpkg normalmente. Una vez hecho eso arrancamos una ventana de terminal, nos vamos al directorio donde queramos descargar el código fuente y escribimos el siguiente comando:

hg clone http://core-plot.googlecode.com/hg/ core-plot

El último argumento del comando anterior (core-plot) será el directorio donde haremos el check-out.

Una vez que tenemos el código veremos que dispone de varios ejemplos para iOS y OSX que podremos reusar para nuestra aplicación. Simple, intuitivo y rápido de implementar.