web-dev-qa-db-ja.com

実行時エラー:前提条件エラー:属性が初期値を設定できませんでした

私はBugSplitViewのビューを持っています。これは単独で問題なく機能しますが、

前提条件の失敗:属性が初期値を設定できませんでした

プレビューまたはシミュレータのいずれかに移動するとエラーが発生します。

ビューには、上部(カラー)と下部(カラー)があり、水平方向のボタンバーで区切られ、GeometeryReaderとsplit状態を使用してレイアウトされています。それがNavigationButtonの宛先である場合、それはプレビューに適切に表示されず、シミュレーターで実行されたときに上記のアサーションを報告します。 BugButtonBarを削除すると機能します。私は困惑しました!助けて。

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

問題は、ボタンが計算されたプロパティとして宣言されていることです。クラッシュを解決するには、次のように宣言します。

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

このエラー-直接デバッグできない-は非常に多くの異なる問題が原因である可能性があるため、ここにも私のケースを投げると思いました。

私の場合、私が得ていたエラーは:

前提条件の失敗:属性が初期値を設定できませんでした-128

問題は、以下のように、内部にNavigationViewを含むシートをVStackに表示しようとしたことです。

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

修正は、代わりにシートがNavigationViewに表示されていることを確認することでした:

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

後から見ると明らかなようですが、最初にクラッシュが発生したときに、もう少し情報を入手できれば良かったでしょう。

0
scorpiondev

私にとってそれはdisplayModeナビゲーションバーのタイトルのインラインでした。それを削除すると、この問題が修正されます。

クラッシュ

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

クラッシュなし

.navigationBarTitle("Title")
0
Alex

このエラーが発生しました。私の場合は、if-elseステートメントの両方のブロック内にNavigationViewがあることが原因です。

// 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