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()
}
}
}
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"){}]
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.
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")
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")
}
}