Bonjour,
Je refais l’exercice du chapitre 5 du cours SwiftUI sur Core Data, avec le gestionnaire de tâches.
Je suis bloqué sur un bête truc (bien avant l’implémentation de Core Data).
Dans ma vue principale j’ai déplacé le choix du nom de la nouvelle Task dans un composant.
La seule responsabilité du composant est de modifier un String contenant le nom de la nouvelle Task.
J’utilise donc un $ et un @Binding pour y échanger le nom de ma nouvelle Task entre ma vue principale et le composant.
Mon but est de créer la Task et de l’ajouter à la liste quand le nom de ma nouvelle Task est « setté » par le composant. Cette création est, dans un premier temps, de la responsabilité de la vue principale (avant de le faire dans le gestionnaire du jeu bien-sûr).
Dans mon composant TaskNameEditorView :
// MARK:- Binding
@Binding var taskName: String
// MARK:- Private var
@State private var localTaskName = ""
var body: some View {
HStack {
TextField("New task", text: $localTaskName).textFieldStyle(RoundedBorderTextFieldStyle())
Image(systemName: "pencil.tip.crop.circle.badge.plus").onTapGesture {
taskName = localTaskName // Je change la valeur de la propriété "bindée"
}
}
}
Dans ma vue principale :
@State var taskName: String = "" {
didSet {
// Ici je devrais créer ma Task et l'ajouter à la liste de Task, PAS OK
}
}
var body: some View {
VStack {
TaskNameEditorView(taskName: $taskName)
Text(taskName) // CA, OK
Ce qui marche, c’est le setting de taskName, taskName est correctement affiché lors du Text(taskName). Donc le @Binding est ok.
Ce qui ne marche pas, c’est qu’on ne passe pas par le didSet (ni un willSet). Donc je ne peux pas exécuter mon code de création de la Task ni l’ajout à la liste.
J’ai supprimé le composant et fait tout dans la vue principale, et là, ça à marché, on passe bien par le didSet. Mais ce n’est pas une solution acceptable si on veut utiliser des composants View.
Il y’a donc un truc ou une autre manière de faire, connaissez-vous lesquels ?
D’avance merci,
Pascal Micha