Contenido del curso

Operaciones CRUD en un proyecto con MVVM

Editar todos con SwiftUI y Core Data

Resumen

Editar tareas dentro de una app de to-do en SwiftUI implica reutilizar la vista de creación, sincronizar el estado con una variable booleana y actualizar el contexto de Core Data. Si estás construyendo una aplicación con persistencia local en iOS, este flujo te muestra cómo conectar la UI con el view model para que los cambios se reflejen al instante.

¿Cómo corregir la fecha de creación en cada todo?

Antes de tocar la edición, hay un detalle visual que delata un error común: todos los items muestran la misma hora. Eso pasa porque la vista renderiza la hora actual por defecto en lugar de la fecha real almacenada.

Para arreglarlo, abres TodoItemView y reemplazas el valor por defecto del campo de hora por todo.date. Con ese cambio, cada tarea muestra su hora real de creación [00:24].

¿Por qué todas mis tareas muestran la misma hora en SwiftUI? Porque la vista está usando el valor por defecto (hora actual) en lugar de leer la propiedad date del modelo. Reemplaza ese valor por todo.date y se corrige.

¿Cómo reutilizar la vista de creación para editar un todo?

La clave está en no duplicar pantallas. La misma vista que sirve para agregar una nueva tarea puede servir para editarla, siempre que le pases el todo existente como parámetro.

Activar el sheet desde el botón Editar

En TodoPreviewView tienes dos botones: Editar y Archivar. Dentro de la acción del botón Editar cambias el estado de la variable showItTodoCreationSheet a true. Ese cambio dispara la presentación de la pantalla flotante [01:08].

Dentro del overlay de esa vista llamas a TodoSheet, que es tu componente de pantalla parcial. Le envías el binding isShow con el valor de showItTodoCreationSheet y eliminas el resto del content que no necesitas en este flujo [01:45].

Pasar el todo existente a TodoAddView

Dentro del TodoSheet instancias TodoAddView, que es la vista que ya conoces para crear notas. Le pasas dos parámetros en el orden correcto que define su inicializador:

  • showIt: el binding showItTodoCreationSheet.
  • todo: la variable savedTodo que contiene la nota almacenada.

Un detalle práctico: agrega ignoreSafeArea y oculta el teclado del simulador para que no estorbe durante las pruebas [02:55].

¿Cómo precargar los datos del todo en el formulario?

Aquí entra onAppear, el modificador que se ejecuta cuando la vista se carga. Como TodoAddView se reutiliza para crear y editar, necesita saber si llegó un todo con datos o si está vacía.

Dentro del VStack de TodoAddView, en el bloque onAppear, validas si el parámetro todo trae valor. Si lo trae, asignas sus propiedades a las tres variables globales del formulario:

  • title = todo.title.
  • note = todo.note ?? "" (cadena vacía como fallback).
  • date = todo.date.

Con eso, al tocar Editar en cualquier tarea, el formulario aparece con el título, la nota y la fecha precargados [04:30].

¿Qué hace onAppear en SwiftUI? Ejecuta un bloque de código justo cuando la vista aparece en pantalla. Es ideal para precargar datos en formularios reutilizables.

¿Cómo implementar la función updateTodo en el view model?

La edición visual no sirve de nada si no actualiza la base de datos. Vas a TodoViewModel y modificas la función updateTodo para que reciba los nuevos valores.

Definir parámetros con labels claros

La firma de la función queda así:

  • todo: el objeto original (para extraer el identificador).
  • newTitle: String: el título actualizado.
  • note: String: la nota actualizada.
  • date: Date: la fecha actualizada.

Usar el label newTitle evita ambigüedades cuando llamas la función desde la vista [06:30].

Validar la existencia con guard

Dentro de la función usas guard junto con getTodoIndex, una función auxiliar que devuelve el índice del elemento en el arreglo @Published o nil si no existe. Si no encuentra el índice, la función retorna y termina; si lo encuentra, sigue ejecutando.

Con el índice ya disponible accedes al arreglo de todos y modificas las propiedades:

  • todos[index].title = newTitle.
  • todos[index].note = note.
  • todos[index].date = date.

Finalmente llamas a saveData() para persistir los cambios en el contexto de Core Data [07:45].

¿Por qué el botón Guardar no actualiza el todo?

Un error frecuente: implementas la función pero el botón sigue llamando al método de creación. La solución está en el botón Guardar de TodoAddView.

Dentro del bloque condicional que valida si hay un todo cargado, llamas a viewModel.updateTodo enviando los cuatro parámetros: el todo original, el nuevo título, la nota y la fecha. Cuida la sintaxis del label: es withNewTitle, no withTitle [09:20].

Al correr la app, tocas Editar en cualquier tarea, modificas el título a nuevo título y la nota a nueva nota, presionas Guardar y los cambios aparecen reflejados en el listado y en la base de datos local.

¿Qué otra funcionalidad agregarías a tu app de to-dos después de la edición? Cuéntame en los comentarios cómo estás resolviendo la persistencia con Core Data en tus proyectos.