Contenido del curso
Estructura de un Proyecto con MVVM
Operaciones CRUD en un proyecto con MVVM
- 11

Función addTodo con Core Data en SwiftUI
19:47 min - 12

Funcionalidades básicas para gestionar tareas en SwiftUI
14:30 min - 13

Listado y detalle de notas en SwiftUI
22:35 min - 14

Editar todos con SwiftUI y Core Data
13:41 min - 15

Archivar tareas en SwiftUI con Core Data
Viendo ahora - 16

Cómo desarchivar tareas con unarchiveTodo
03:25 min - 17

Eliminar un to do definitivamente con Core Data
04:15 min - 18

Marcar tareas completadas en SwiftUI
20:50 min - 19

Creación de Vistas Amigables en SwiftUI para Aplicaciones de Tareas
19:52 min
Clean Architecture
- 20

Qué es Clean Architecture y por qué supera a MVVM
05:52 min - 21

Estructura y Ventajas de la Clean Architecture
03:47 min - 22

Estructura de proyecto iOS con Clean Architecture
06:01 min - 23

Mapeo de JSON a structs Swift con Codable
09:10 min - 24

Capa de datos con Clean Architecture en Swift
30:54 min - 25

Casos de uso en la capa de dominio Swift
09:35 min - 26

Capa de presentación con MVVM en SwiftUI
15:37 min - 27

Navegación y detalle con Clean Architecture en SwiftUI
21:54 min
MVVM y Clean Architecture
Archivar tareas en SwiftUI con Core Data
Resumen
Aprende a implementar la función de archivar tareas en una app SwiftUI con Core Data, conectando el ViewModel, filtrando entidades y mostrando una lista separada de elementos archivados. Es un paso clave si estás construyendo una to do app y quieres separar tareas activas de las que ya guardaste para después.
La funcionalidad parte de algo concreto: ya tienes el botón de archivar en la vista previa, pero al pulsarlo no pasa nada. Vamos a darle vida desde la lógica hasta la interfaz.
Cómo agrego la función archive to do en el ViewModel
Todo arranca en el ViewModel, donde defines la función archiveToDo que recibe un ToDoEntity y modifica su estado.
La lógica sigue tres pasos claros que debes respetar para evitar errores con Core Data [01:05]:
- Usa una sentencia
guardcongetToDoIndexpara verificar que el elemento existe por su índice. Si no lo encuentra, sale de la función. - Accede al elemento dentro del arreglo
toDosusando ese índice y cambia su propiedadisArchivedatrue. - Llama a
saveData()para persistir el cambio en el contexto de Core Data.
Esa estructura es la misma que usarás para cualquier acción que modifique una entidad: validar, mutar, guardar. Sin ese orden, los datos no sobreviven al cierre de la app.
¿Qué hace isArchived en una to do app? Es una propiedad booleana de la entidad que marca si la tarea está archivada. Cuando es
true, la tarea desaparece de la lista principal y aparece en la lista de archivados.
Dónde llamo a archiveToDo desde la interfaz
La llamada vive en el ToDoPreviewView, que es la pantalla de detalle con los botones de editar y archivar [02:30]. Como ya tienes una referencia al ViewModel en esa vista, solo conectas el botón.
Dentro del botón archivar escribes viewModel.archiveToDo(toDo: savedToDo) y, justo después, vacías la variable toDo para cerrar la pantalla automáticamente. Un detalle importante: usa savedToDo, no self.toDo, porque esa es la variable donde guardaste el elemento de forma segura.
Si corres la app y archivas una tarea, desaparece de la lista principal. Eso confirma que el filtro original solo muestra elementos con isArchived en false. Pero la pantalla de archivados sigue vacía. Ese es el siguiente bloque.
Cómo construyo la vista ToDoArchiveListView
Esta vista necesita tres piezas: la referencia al ViewModel, una propiedad computada que filtre los archivados, y un ScrollView con ForEach para listarlos [05:10].
Empiezas declarando @EnvironmentObject private var viewModel: ToDoViewModel. Luego defines:
- Una
private var archivedToDos: [ToDoEntity]que retornaviewModel.toDos.filter { $0.isArchived == true }. - Un
if !archivedToDos.isEmptypara mostrar el listado solo cuando hay datos. - Un
ForEach(archivedToDos) { toDo in ... }que itera y dibuja cada ítem dentro de unZStackconpaddinghorizontal.
El uso de filter con la condición isArchived == true es lo que separa visualmente las dos listas sin duplicar entidades. Una sola fuente de datos, dos vistas distintas.
Qué pongo dentro del ItemView de archivados
El archivo ItemView ya tiene la estructura de diseño vacía. Le agregas la referencia al ViewModel, una var toDo: ToDoEntity pública, y validas dentro del HStack que el toDo.identifier no esté vacío [08:20]. Si no hay datos, retornas un EmptyView en el else.
Dentro del VStack muestras dos textos:
- El título con
.font(.headline),.lineLimit(1)y.padding(.top, -4)para que no se pegue al borde. - La fecha usando
toDo.datecon un formatodía.mes.año, porque sin formato Core Data devuelve un objetoDategenérico ilegible.
¿Por qué uso lineLimit en el título de una tarea? Porque los títulos largos rompen el diseño del item. Limitar a una línea mantiene la lista visualmente uniforme sin importar cuánto texto escriba el usuario.
Los íconos de basurero y plus que ves en el diseño quedan reservados para dos acciones futuras: eliminar definitivamente y desarchivar. En esta iteración solo muestras el elemento.
Cómo conecto el ItemView a la lista de archivados
Vuelves a ToDoArchiveListView y dentro del ForEach llamas a ToDoArchiveItemView(toDo: toDo), pasándole la entidad iterada [11:00]. Con eso cierras el ciclo: el ViewModel archiva, la lista filtra, el ítem renderiza.
Al correr la app y archivar tres tareas distintas, las tres aparecen en la pantalla de archivados con su título y fecha. Si creas una nueva tarea llamada Nuevo toDo, la archivas y revisas, ahí la tienes junto a las anteriores.
Este patrón —filtrar por una propiedad booleana de la entidad y renderizar en una vista paralela— lo vas a reutilizar para favoritos, completados o cualquier estado adicional que quieras agregar a tu app. ¿Cómo lo aplicarías en tu propio proyecto? Cuéntalo en los comentarios.