In deze Core Data tutorial bouwen we een app waarin de belangrijkste onderdelen van Core Data aan bod komen.
Deel 1 uit deze tutorial vind je hier.
In deze aflevering zien we hoe we onze notities kunnen wijzigen en verwijderen.
Met de video-opnames van deze nieuwe LIVE Clinic over Core Data leer je in één dag hoe je zelf Core Data in je apps kunt gebruiken. Gewoon thuis, vanachter je Mac!
Meer informatieOmdat onze app volgens het MVC (Model View Controller)-principe is gebouwd, laten we het feitelijke wijzigen en verwijderen van gegevens over aan ons model: Model.swift
.
Het wijzigen van een notitie in de Core Data-database is heel eenvoudig. Voeg de volgende methode toe aan Model.swift
:
1 2 3 4 5 |
func wijzig(titel: String, voor notitie: Notitie) { notitie.titel = titel saveContext() } |
Nu ons model een notitie kan wijzigen, kunnen we de gebruiker die mogelijkheid geven: zodra hij over een notitie ‘veegt’, laten we een menu met een Wijzig-optie verschijnen. Dit menu verschijnt automatisch als we onze tableview een antwoord geven op de vraag: ‘wat zijn de wijzig-opties voor deze rij?’. Deze vraag stelt de tableview aan zijn delegate, via de methode tableView(_:editActionsForRowAt:)
.
Allereerst maken we van de viewcontroller de delegate voor de tableview, door de definitie van de ViewController-class aan te passen:
1 2 |
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate |
Nu kunnen we de delegate-methode tableView(_:editActionsForRowAt:)
toevoegen. Deze methode moet een optional array met UITableViewRowAction
-objecten retourneren: elke UITableViewRowAction
heeft een stijl (de manier waarop de menu-optie wordt weergegeven, een titel (de tekst die voor de menu-optie wordt getoond) en een closure die wordt uitgevoerd zodra de gebruiker de menu-optie kiest.
Voeg de volgende delegate-methode toe aan ViewController.swift
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let wijzigAction = UITableViewRowAction(style: .normal, title: "Wijzig") { actie, indexPath in let notitie = Model.shared.notitie(op: indexPath.row) if let titel = notitie.titel { let alert = UIAlertController(title: "Wijzig notitie", message: nil, preferredStyle: .alert) alert.addTextField() alert.textFields?.first?.text = titel alert.addAction(UIAlertAction(title: "Annuleer", style: .cancel)) alert.addAction(UIAlertAction(title: "OK", style: .default) { actie in if let titel = alert.textFields?.last?.text { Model.shared.wijzig(titel: titel, voor: notitie) self.tableView.reloadData() } }) self.present(alert, animated: true) } } return [wijzigAction] } |
Sleep naar links over een tabelrij. Er wordt nu een ‘Wijzig’-optie getoond:
Klik erop, waarna een alert verschijnt met de oorspronkelijke titel van de notitie.
Wijzig de notitie:
Zodra je op de OK-button drukt, wordt de tabel opnieuw geladen en zie je de wijzigingen.
Uiteraard laten we het echte werk over aan het model van onze app.
Voeg de volgende methode toe aan de Model
-class:
1 2 3 4 5 |
func verwijder(notitie: Notitie) { persistentContainer.viewContext.delete(notitie) saveContext() } |
Ook de verwijder-actie wordt een ‘edit-action’. We zouden die actie, met closure, kunnen toevoegen aan de methode die we al hebben geschreven, .tableView(_:editActionsForRowAt:)
. Die methode wordt daardoor echter heel lang. De oplossing: we schrijven functies voor de afzonderlijke edit-acties.
Voeg de .wijzig(notitie:)
-methode toe aan ViewController.swift
. Deze bevat bijna alle code uit de .tableView(_:editActionsForRowAt:)
-methode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
func wijzig(notitie: Notitie) { if let titel = notitie.titel { let alert = UIAlertController(title: "Wijzig notitie", message: nil, preferredStyle: .alert) alert.addTextField() alert.textFields?.first?.text = titel alert.addAction(UIAlertAction(title: "Annuleer", style: .cancel)) alert.addAction(UIAlertAction(title: "OK", style: .default) { actie in if let titel = alert.textFields?.last?.text { Model.shared.wijzig(titel: titel, voor: notitie) self.tableView.reloadData() } }) self.present(alert, animated: true) } } |
Pas nu de .tableView(_:editActionsForRowAt:)
-methode aan. Hij wordt een stuk korter:
1 2 3 4 5 6 7 8 9 10 |
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let wijzigAction = UITableViewRowAction(style: .normal, title: "Wijzig") { actie, indexPath in self.wijzig(notitie: Model.shared.notitie(op: indexPath.row)) } return [wijzigAction] } |
Op soortgelijke manier handelen we de ‘verwijder’-actie af: we schrijven een ‘verwijder’-methode, die we ook weer kunnen aanroepen vanuit de closure in .tableView(_:editActionsForRowAt:)
. Voeg de volgende methode toe aan ViewController
-swift:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
func verwijder(notitie: Notitie) { if let titel = notitie.titel { let alert = UIAlertController(title: nil, message: titel, preferredStyle: .actionSheet) alert.addAction(UIAlertAction(title: "Annuleer", style: .cancel)) alert.addAction(UIAlertAction(title: "Verwijder", style: .destructive) { actie in Model.shared.verwijder(notitie: notitie) self.tableView.reloadData() }) self.present(alert, animated: true) } } |
Vlak voordat het item wordt verwijderd, vragen we de gebruiker nog om een bevestiging. De door Apple aangeraden manier om dat te doen is niet via een alert, maar met een action sheet:
1 2 |
let alert = UIAlertController(title: nil, message: titel, preferredStyle: .actionSheet) |
Nu kunnen we eenvoudig een edit-actie met een rode ‘Verwijder’-button toevoegen. Wijzig de .tableView(_:editActionsForRowAt:)
-methode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { let wijzigAction = UITableViewRowAction(style: .normal, title: "Wijzig") { actie, indexPath in self.wijzig(notitie: Model.shared.notitie(op: indexPath.row)) } // NIEUW let verwijderAction = UITableViewRowAction(style: .destructive, title: "Verwijder") { actie, indexPath in self.verwijder(notitie: Model.shared.notitie(op: indexPath.row)) } return [wijzigAction, verwijderAction] // GEWIJZIGD } |
Deze methode retourneert nu dus twee acties: ‘Wijzig’ en ‘Verwijder’.
Sleep van rechts naar links over één van de tabelrijen, waarna de acties worden getoond:
Kies Verwijder. Er verschijnt een Action Sheet, met de titel van de notitie die zal worden verwijderd:
Zodra je op Verwijder klikt, wordt de notitie door het model verwijderd. Daarna krijgt de tabel opdracht zich opnieuw te tekenen, waardoor de notitie ook van het scherm verdwijnt:
In dit artikel heb je gezien hoe je items uit een Core Data-database kunt verwijderen en hoe je de gebruikersinterface kunt maken. In het volgende en laatste artikel zie je hoe je een Core Data-database kunt doorzoeken en hoe je de resultaten aan de gebruiker kunt laten zien.
Klik hier om de Xcode-bestanden van dit artikel te downloaden.
Met de video-opnames van deze nieuwe LIVE Clinic over Core Data leer je in één dag hoe je zelf Core Data in je apps kunt gebruiken. Gewoon thuis, vanachter je Mac!
Meer informatie