A la hora de definir las preferencias de la aplicación existen dos opciones: definirlas como un menú propio de la aplicación o integrarlas dentro del panel de preferencias del sistema. En esta sección se verá como hacer la segunda opción.
Settings.app
es la aplicación de configuración del sistema y permite que aplicaciones de terceros añadan sus preferencia. De esta forma tenemos las preferencias de todas nuestras aplicaciones centradas en un único punto.
Las preferencias se representan con la clase NSUserDefaults
. NSUserDefaults se accede de forma similar a un NSDictionary.
La diferencia principal es que los datos se almacenan en disco en vez de en memoria.
Desde el punto de vista del programador, una de las ventajas de colocar las preferencias en Settings.app
es que no es necesario definir la interfaz gráfica que van a llevar las preferencia. Únicamente es necesario definir un fichero de propiedades y Settings.app
se encargará de definir la interfaz de forma automática.
Crea el fichero de preferencia File/new File/Settings & bundle
y edita el fichero Root.plist
que se acaba de
crear. El fichero se creó con unas preferencias por defecto, arranca el simulador para que puedas ver gráficamente
en qué se traduce esta definición. Dentro del simulador, en Settings.app
se creó una nueva opción con nuestra aplicación
y dentro tiene la interfaz definida en el sistema de propiedades.
En la definición de propiedades el campo importante es el identifier
. Es la clave por la que luego, desde nuestra
aplicación podemos recuperar ese valor.
Para leer las preferencias desde la aplicación, se utiliza la clase NSUserDefaults
.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
Esta implementado como un Singleton, únicamente hay una instancia en la aplicación. Esta clase funciona de forma muy similar a un diccionario. Por ejemplo tenemos el método objectForKey:
para recuperar el valor dado su identificador.
En el caso de que quieras escribir en las preferencias desde la aplicación, lo único que debes hacer es escribir en el NSUserDefaults
y sincronizar, para que los cambios realizados se guarden en disco.
[defaults synchronize];
La definición del fichero plist es bastante sencilla, únicamente nos hace falta simplificar la definición que viene por defecto eliminando los items 2 y 3 y asignarle un identificador al textfield.
Desde la aplicación, en la clase HZFNewCheckinViewController
:
- (NSString *)usernameFromSettings {
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
return [userDefaults objectForKey:@"username"];
}
- (IBAction)save:(UIBarButtonItem *)sender {
HZFCheckin *checkin = [[HZFCheckin alloc] init];
..
checkin.usuario = [self usernameFromSettings];
..
}