Creación de Vistas Amigables en SwiftUI para Aplicaciones de Tareas
Clase 19 de 28 • Curso de Patrones MVVM en iOS
Resumen
La funcionalidad de una aplicación debe ir más allá de su operatividad básica para ofrecer una experiencia visualmente atractiva. Crear vistas personalizadas puede resolver el problema de visualizar pantallas que resultan visualmente vacías cuando no tenemos tareas ni archivadas ni no archivadas. Tomemos el ejemplo de crear una nueva vista en SwiftUI llamada NoTodoView
para evitar que el fondo quede simplemente en color negro o blanco.
¿Cómo implementamos NoTodoView en SwiftUI?
Primero, diseñamos la estructura para mostrar un mensaje claro que invite a crear nuevas tareas:
import SwiftUI
struct NoTodoView: View {
@Binding var showCreationSheet: Bool
var body: some View {
VStack(spacing: 8) {
Text("No hay tareas aún.")
.font(.title2)
Button(action: {
self.showCreationSheet.toggle()
}) {
Text("Intenta crear una tarea")
.font(.headline)
.foregroundColor(.white)
.padding()
.background(Color.teal)
.cornerRadius(5)
}
}
.offset(y: UIScreen.main.bounds.height * 0.3)
}
}
El VStack
nos permite organizar los elementos verticalmente, mientras que el botón está preparado para activar un sheet
de creación cuando no hay tareas presentes. La propiedad offset
sitúa el contenido en el centro de la pantalla para una mejor visualización.
¿Cómo aplicamos validaciones de visualización?
Este no todos view
debe integrarse en la estructura de nuestra aplicación. Hazlo donde inicialmente la aplicación no mostraba nada si no había listas de tareas. Por ejemplo, dentro de la función de validación del TodoList
:
if todos.isEmpty {
NoTodoView(showCreationSheet: $showSheet)
} else {
// Mostrar lista de tareas normal
}
La variable todos
representa la lista de tareas; si está vacía, la aplicación presentará NoTodoView. Esto proporciona un flujo visual más coherente y evita que los usuarios se enfrenten a pantallas vacías.
¿Cómo crear una vista para tareas archivadas?
Al igual que implementamos NoTodoView
, también podemos diseñar un NoArchivedView
para la sección de tareas archivadas, asegurando así que todas partes de nuestra aplicación brindan una experiencia de usuario homogénea.
¿Qué es NoArchivedView y cómo se implementa?
Este es un ejemplo de cómo estructuramos la vista para los archivos sin contenido:
import SwiftUI
struct NoArchivedView: View {
@Environment(\.dismiss) var dismiss
var body: some View {
VStack(spacing: 8) {
Text("No existen notas archivadas.")
.font(.title2)
Button(action: {
dismiss()
}) {
Text("Ver todas las notas")
.font(.headline)
.foregroundColor(.white)
.padding()
.background(Color.teal)
.cornerRadius(5)
}
}
.frame(maxWidth: 200)
.offset(y: UIScreen.main.bounds.height * 0.35)
}
}
Aquí usamos un Environment
para permitir que la vista se cierre cuando no hay notas archivadas, y el botón nos dirige a visualizar todas las notas disponibles, mejorando la navegabilidad dentro de la aplicación.
¿Cómo implementar una arquitectura MVVM en una aplicación?
Para el desarrollo de la aplicación hicimos uso del patrón modelo-vista-vista-modelo (MVVM), que proporciona una organización clara y facilita el mantenimiento a largo plazo. Separamos responsabilidades en tres capas clave:
-
Modelo (Model): Define los datos que maneja la aplicación. Por ejemplo, el objeto
Item
que representa tareas con su id, título, descripción, fechas, y estados de archivo o completado. -
Vista de Modelo (ViewModel): Actúa como intermediario entre la vista y el modelo, manejando la lógica de negocio. Usa
ObservableObject
para que las vistas se actualicen automáticamente. Esta mediación es crucial para que cualquier cambio en los datos refleje inmediatamente en la interfaz de usuario. -
Vista (View): Presenta la interfaz al usuario basándose en la lógica proporcionada por el ViewModel, asegurando que las acciones del usuario se traduzcan apropiadamente en cambios de estado o de interfaz.
La arquitectura MVVM se enfoca principalmente en la presentación, manteniendo el código organizado y separando las preocupaciones, lo cual facilita la escalabilidad y el mantenimiento. Sin embargo, no es la única ni necesariamente la mejor opción organizativa, ya que futuras implementaciones podrían requerir estructuras más complejas que se adapten mejor a necesidades específicas.
¡A seguir aprendiendo y construyendo aplicaciones más eficientes y atractivas!