私は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()
}
}
}
問題は、ボタンが計算されたプロパティとして宣言されていることです。クラッシュを解決するには、次のように宣言します。
var buttons = [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
このエラー-直接デバッグできない-は非常に多くの異なる問題が原因である可能性があるため、ここにも私のケースを投げると思いました。
私の場合、私が得ていたエラーは:
前提条件の失敗:属性が初期値を設定できませんでした-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 */
}
}
後から見ると明らかなようですが、最初にクラッシュが発生したときに、もう少し情報を入手できれば良かったでしょう。
私にとってそれはdisplayModeナビゲーションバーのタイトルのインラインでした。それを削除すると、この問題が修正されます。
クラッシュ
.navigationBarTitle("Title", displayMode: .inline)
クラッシュなし
.navigationBarTitle("Title")
このエラーが発生しました。私の場合は、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")
}
}