web-dev-qa-db-fra.com

Erreur d'exécution: échec de la condition préalable: l'attribut n'a pas pu définir une valeur initiale

J'ai une vue BugSplitView qui fonctionne bien seule mais provoque une

échec de la condition préalable: l'attribut n'a pas pu définir une valeur initiale

erreur lors de la navigation dans l'aperçu ou le simulateur.

La vue a une partie supérieure (Couleur) et une partie inférieure (Couleur) séparées par une barre de boutons horizontale et disposées à l'aide du GeometeryReader et d'un état split. Lorsqu'il est la destination de NavigationButton, il ne s'affiche pas correctement dans l'aperçu et signale l'assertion ci-dessus lorsqu'il est exécuté dans le simulateur. Supprimez le BugButtonBar et cela fonctionne. Je suis perplexe! Aidez-moi.

import SwiftUI

struct BugSplitView: View {
    @State var split : CGFloat = 0.75
    var buttons : [BugButtonBar.Info]{
        [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
    }
    var body: some View {
        GeometryReader{ g in
            VStack(spacing: 0){
                Color.gray
                    .frame(width: g.size.width, height: (g.size.height) * self.split)
                VStack{
                    BugButtonBar(infos: self.buttons)
                    Color(white: 0.3)
                }
                    .frame(height: (g.size.height) * (1 - self.split))
            }
        }.edgesIgnoringSafeArea(.all)
    }
}


struct BugButtonBar : View{

    struct Info : Identifiable {
        var id = UUID()
        var title : String
        var imageName : String
        var action: () -> Void
    }

    var infos : [Info]
    func color() -> Color{
        Color.black
    }
    var body: some View {
        HStack(){
            Spacer()
            ForEach(self.infos){ info in
                Button(action: info.action){
                    Text(info.title)
                }
                Spacer()
            }
        }
    }
}


struct ShowBugView : View{
    var body : some View{
        NavigationView {
            NavigationLink(destination: BugSplitView()){
                Text("Show Bug")
            }
        }
    }
}


struct BugSplitView_Previews: PreviewProvider {
    static var previews: some View {
        Group{
            BugSplitView()
            ShowBugView()
        }
    }
}
3
Rumbles

Le problème est que vos boutons sont déclarés comme propriété calculée. Pour résoudre le crash, déclarez-les comme ceci:

var buttons = [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
0
LuLuGaGa

Puisqu'il semble que cette erreur - qui ne peut pas être déboguée directement - peut être causée par tant de problèmes différents, j'ai pensé que je jetterais mon cas ici aussi.

Dans mon cas, l'erreur que j'obtenais était:

échec de la condition préalable: l'attribut n'a pas pu définir une valeur initiale - 128

Le problème était que j'essayais de présenter une feuille sur un VStack qui contenait une NavigationView à l'intérieur, comme ci-dessous:

var body: some View {
    VStack(alignment: .center) {
        if /* some condition */ {
            /* some other content */
        } else {
            NavigationView {
                /* view content */
            }
        }
    }.sheet(isPresented: /* Binding value */) { 
        /* sheet content */
    }
}

Le correctif consistait à s'assurer que la feuille était présentée à la place sur NavigationView:

var body: some View {
    NavigationView {
        VStack(alignment: .center) {
            if /* some condition */ {
                /* some other content */
            } else {
                /* view content */
            }
        }
    }.sheet(isPresented: /* Binding value */) { 
        /* sheet content */
    }
}

Cela semble évident avec le recul, mais il aurait été agréable d'obtenir un peu plus d'informations lorsque l'accident s'est produit en premier lieu.

0
scorpiondev

Pour moi, c'était displayMode inline dans le titre de la barre de navigation. Le supprimer résout ce problème.

Crash

.navigationBarTitle("Title", displayMode: .inline)

Pas de crash

.navigationBarTitle("Title")
0
Alex

J'ai eu cette erreur. Dans mon cas, cela a été causé par le fait d'avoir une NavigationView à l'intérieur des deux blocs d'une instruction if-else.

// bad
if someBool {
  NavigationView {
    Text("some content")
  }
} else {
  NavigationView {
    Text("different content")
  }
}
// good
NavigationView {
  if someBool {
    Text("some content")
  } else {
    Text("different content")
  }
}
0
Benjamin Kindle