Ejercicios de persistencia básica 1
Ejercicio 1: Property lists (0,6)
Vamos a realizar una pequeña aplicación en la que los datos se guarden/recuperen de un archivo .plist. Desde el punto de vista del usuario consistirá en una única “pantalla” con un Text View para editar un mensaje y un Label que mostrará la fecha y hora de edición. Los datos deben conservarse aunque salgamos de la aplicación.
Interfaz gráfico (0,1)
Crea la interfaz:
- Inserta el
Text Viewy elLabelen el storyboard. - En el
ViewController- Crea una propiedad llamada
fechaEdicionde tipoDateque representará la fecha y hora en que se haya editado el texto - Crea dos outlet para acceder al contenido de ambos componentes. Recuerda que tienes que hacer
Ctrl+arrastrar
- Crea una propiedad llamada
Queremos que cuando haga tap en cualquier parte de la pantalla se acabe la edición del Text View. Para ello podemos añadir el siguiente método al ViewController:
override func touchesEnded(_ touches: Set<UITouch>, with: UIEvent?) {
//CUIDADO: estamos suponiendo que el outlet del text view se llama "mensaje"
//cámbialo por como lo hayas llamado tú
self.mensaje.resignFirstResponder()
}
Finalmente, queremos detectar cuándo se ha editado el texto del Text View. Para ello tenemos que hacer que el view controller implemente el protocolo UITextViewDelegate. En la cabecera del ViewController añadimos el protocolo:
class ViewController : UIViewController, UITextViewDelegate {
...
Ahora en el mismo ViewController indicamos que este objeto es el delegate del Text View. El el viewDidLoad añadimos
self.mensaje.delegate = self;
Y finalmente también en el ViewController podemos detectar cuándo se ha hecho la edición implementando este método:
func textViewDidEndEditing(_ textView: UITextView) {
print("acabamos de editar")
self.fechaEdicion = Date()
//SUPONEMOS que el outlet del label se llama "fechaLabel"
//CAMBIALO si es necesario
self.fechaLabel.text = DateFormatter.localizedString(from: self.fechaEdicion, dateStyle: .short, timeStyle: .short)
}
Comprobar que lo anterior funciona correctamente, que al editar el texto y pulsar sobre la pantalla se dispara el método anterior, y en el label se muestra la fecha y hora de edición.
Detectar que salimos de la aplicación (0,1)
Lo primero es detectar cuándo salimos de la aplicación para poder hacer el guardado de los datos en ese momento. Para ello podemos suscribirnos a una notificación del sistema llamada UIApplicationDidEnterBackground.
Introducir el siguiente código en el método viewDidLoad del view controller:
let nc = NotificationCenter.default
nc.addObserver(self, selector:#selector(self.vamosABackground), name:NSNotification.Name.UIApplicationDidEnterBackground, object: nil)
El código anterior llama al método vamosABackground cuando se recibe la notificación. Para probarlo, podéis hacer una implementación “provisional” del método:
func vamosABackground() {
print("Nos notifican que vamos a background");
}
Ahora, para probar que esto funciona, hay que arrancar la aplicación y salir de ella como lo haríamos en un dispositivo real, es decir, pulsando sobre el botón Home. Podemos hacerlo en el menú del simulador Hardware > Home, o bien con el atajo de teclado Cmd+Shift+H. Al hacer esto debe aparecer el mensaje en el log. Comprueba que es así.
Almacenar los datos en el .plist (0,2)
Queremos guardar el texto del mensaje y la fecha de edición. Podemos almacenar ambos valores usando un NSMutableDictionary.
En el método vamosABackground que hemos creado antes tenemos que:
- Obtener la URL del directorio
Documentsde la aplicación (consultar apuntes) - Crear a partir de ella la URL del fichero
mensaje.plistdonde se guardarán los datos (consultar apuntes) - Crear un diccionario con el texto del mensaje y la fecha de edición (adaptadlo a vuestras necesidades)
- Convertir el diccionario a un
NSDictionaryconas - Guardar el archivo
.plistusando el métodowrite(to:atomically:)del diccionario
Comprobar que cuando se sale de la aplicación pulsando el botón Home se ha creado el correspondiente archivo .plist con el contenido adecuado.
Recuperar los datos del .plist (0,2)
Si salimos de la aplicación pulsando el botón Home y volviendo a entrar en ella veremos muy probablemente que se conservan los datos, pero es porque el sistema no ha liberado la memoria. Para recuperarlos al arrancar la aplicación “desde cero”, tenemos que añadir código al viewDidLoad del view controller: (los dos primeros pasos son los mismos que para guardar los datos)
- Obtener la URL del directorio
Documentsde la aplicación (consultar apuntes) - Crear a partir de ella la URL del fichero
mensaje.plistdonde están los datos (consultar apuntes) - Recuperar el
NSDictionarycon el inicializadorNSDictionary(contentsOfFile:)
Comprobar que cuando paramos el simulador y lo volvemos a poner en marcha se recuperan los datos del .plist.
Ejercicio 2: Preferencias (0,4)
Crear una nueva aplicación similar a la anterior pero que almacene y recupere la información usando el mecanismo de preferencias de iOS.
Es mejor crear un proyecto nuevo, para evitar “interferencias” con el código anterior, aunque tendréis que crear de nuevo los elementos de la interfaz y los outlets