J’essaie d’aller plus loin dans l’application « Tasks »
J’ai glissé toutes mes tâches dans une liste.
Lorsqu’une tâche est sélectionnée, on change de View grâce à une NavigationView vers SousTachesView.
Dans SousTachesView je souhaite avoir des « SousTâches » qui apparaissent.
Et notamment je cherche dans CoreData une liste de sous tâches qui correspondent à la tâche principale selectionnée.
Quand j’arrive dans SousTachesView j’ai
struct SousTachesView: View { let objTask: Task @Statevar sousTaskManager = SousTaskManager(objTache: objTask) ← ERREUR : Cannot use instance member ‹ objTask › within property initializer; property initializers run before ‹ self › is available
J’ai cependant une erreur : Comment envoyer ma tâche à SousTaskManager avec le paramètre objTask que j’initialise ?
Sinon pouvez-vous m’aiguiller vers des chapitres ou notions à approfondir ?
Merci
Clément
Salut,
il est possible d’initialiser une variable avec un paramètre mais tu ne peux pas utiliser une variable qui n’est pas encore initialisée, ce qui est le cas ici de objTask.
Tu as 2 solutions pour y avoir accès :
Soit tu crées un constructeur manuellement et dans le init, tu pourras accéder à l’objet objTask reçu en paramètre
Soit tu utilises la fonction onAppear sur ta vue pour déclencher du code dès que ta vue est disponible :
Merci Maxime,
J’ai compris le principe de onAppear et ça fonctionne…
Enfin ça devrait, le problème est reporté ailleurs !
struct sousTaskManager {
var sousTaskList:[SousTask]
let storage: OriEPS = OriEPS()
let taskId : UUID
init(taskId:UUID) {
sousTaskList = storage.fetchSousTaskList(taskId: taskId)
}
L’erreur suivante apparait : Return from initializer without initializing all stored properties
Cette fois-ci je ne suis pas dans une View, donc je ne peux pas utiliser la méthode onAppear.
Deuxième problème, quand l’application s’ouvre, je n’ai pas encore choisi de Tâche principale, donc je n’ai pas de « id » de tâche à transmettre.
Donc je ne veux pas que la sousTaskList (et notamment SousTaskManager() ) se charge tant que la tâche n’est pas choisie, comment puis-je faire ? Comment retarder l’init()
Sinon vers quel chapitre m’orienter pour obtenir ces informations ?
Je ne sais pas si c’est ça, mais j’ai l’impression que tu veux assurer la permanence d’un tableau que tu n’as pas encore initialisé ? En fait, as-tu mis des sousTask dans sousTaskList ou l’as tu juste déclaré ? Je te prie de m’excuser si je suis à côté de la plaque.
Tu as une propriété taskId qui n’est pas initialisée à la fin de ton constructeur.
Si tu as vraiment besoin de cette propriété, tu dois ajouter la ligne suivante au tout début de ton constructeur :