Je sais que c'est une question assez ancienne, mais le problème existe toujours. Voici ce que j'ai trouvé en faisant cette expérience.
Dans un NavigationLink, je donnais un paramètre à une vue qui n'en prenait pas. Cela a bloqué la construction et l'indexation, mais n'a pas provoqué d'erreur de compilation. C'est que PAS cool.
Voici comment je l'ai reproduit. Dans une vue de premier niveau qui contient une vue de navigation, j'avais le bloc suivant dans une liste dans une pile. La hiérarchie de ma vue de premier niveau était donc quelque chose comme (pseudocode) :
Body {
VStack {
[CustomViewForPageHeader]
List {
(the code block pasted below)
(some other things)
}
}
}
La partie offensante était la suivante :
if 0 < viewModel.taskUpdates.count {
Section( "Chore updates"){
ForEach(viewModel.taskUpdates, id:\.id){ update in
if "complete" == update.statusType {
NavigationLink {
CompletedTaskApprovalView( update: update )
} label: {
Text(update.formattedMessage)
.padding(.vertical)
}
}
if "reject" == update.statusType {
Text(update.formattedMessage)
.padding(.vertical)
}
}
}
}
Me rappelant que j'avais supprimé le paramètre lors de la restructuration de certaines données, j'ai été consterné que le compilateur n'ait pas vomi sur ce point. J'ai commenté toute la ligne, de sorte qu'elle ressemblait à :
if 0 < viewModel.taskUpdates.count {
Section( "Chore updates"){
ForEach(viewModel.taskUpdates, id:\.id){ update in
if "complete" == update.statusType {
NavigationLink {
//CompletedTaskApprovalView( update: update )
} label: {
Text(update.formattedMessage)
.padding(.vertical)
}
}
if "reject" == update.statusType {
Text(update.formattedMessage)
.padding(.vertical)
}
}
}
}
Et voilà, ça a marché comme sur des roulettes.
Non-commenté et a supprimé le paramètre...
if 0 < viewModel.taskUpdates.count {
Section( "Chore updates"){
ForEach(viewModel.taskUpdates, id:\.id){ update in
if "complete" == update.statusType {
NavigationLink {
CompletedTaskApprovalView()
} label: {
Text(update.formattedMessage)
.padding(.vertical)
}
}
if "reject" == update.statusType {
Text(update.formattedMessage)
.padding(.vertical)
}
}
}
}
whammo, redux, encore une fois, ça a bien marché.
J'ai tout dépouillé de la CompletedTaskApprovalView pendant que je retravaillais un peu le modèle de données, donc ça ressemble à ça (littéralement juste un emplacement) :
import SwiftUI
struct CompletedTaskApprovalView: View {
var body: some View {
Text("Approve chores")
.font(.title)
}
}
Le compilateur n'aurait jamais dû me laisser essayer de lui donner un paramètre. J'ai pensé que c'était bizarre, et je me suis demandé si le fichier de code de ma vue n'avait pas une sorte de corruption funky non visible. Dans le fichier de la vue de niveau supérieur, j'ai ajouté une nouvelle vue (SomeTestView) en bas...
struct SomeTestView: View {
var body: some View {
Text("this is just a thing")
}
}
et l'a ajouté à ma boucle..
if 0 < viewModel.taskUpdates.count {
Section( "Chore updates"){
ForEach(viewModel.taskUpdates, id:\.id){ update in
if "complete" == update.statusType {
NavigationLink {
//CompletedTaskApprovalView()
SomeTestView()
} label: {
Text(update.formattedMessage)
.padding(.vertical)
}
}
if "reject" == update.statusType {
Text(update.formattedMessage)
.padding(.vertical)
}
}
}
}
Cela fonctionne bien.
Ajout d'un paramètre à l'instanciation ci-dessus (mais n'a pas fait PAS ajouter un à la définition de structure de la vue)... et il s'est comporté de la même manière que le problème original - il a bloqué la construction et l'indexation, apparemment sans fin, et n'a jamais vomi l'erreur de paramètre que j'attendais.
if 0 < viewModel.taskUpdates.count {
Section( "Chore updates"){
ForEach(viewModel.taskUpdates, id:\.id){ update in
if "complete" == update.statusType {
NavigationLink {
//CompletedTaskApprovalView()
SomeTestView( fish: "sandwich" )
} label: {
Text(update.formattedMessage)
.padding(.vertical)
}
}
if "reject" == update.statusType {
Text(update.formattedMessage)
.padding(.vertical)
}
}
}
}
Donc c'est bizarre et 100% décevant. Je me garde bien de faire un diagnostic plus poussé, mais... si quelqu'un rencontre encore ce problème, essayez-le ; vérifiez soigneusement vos paramètres et déclarations, et vous trouverez peut-être un problème similaire.
Bizarre. Frustrant. Confus. Agaçante.