13

我有一个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()
        }
    }
}
4

8 回答 8

5

问题是您的按钮被声明为计算属性。要解决崩溃,请像这样声明它们:

var buttons = [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
于 2019-10-26T20:58:49.177 回答
4

对我来说,它是导航栏标题中的displayMode内联。删除它可以解决此问题。

碰撞

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

没有崩溃

.navigationBarTitle("Title")
于 2020-02-21T20:04:51.280 回答
3

原来 struct Info 的 id 属性是问题所在。将其更改为计算属性,如下所示:

var id : String {
   title + imageName
}

我为什么喜欢/讨厌 SwiftUI 的一个很好的例子。

于 2019-10-26T21:39:28.997 回答
2

由于这个错误(无法直接调试)似乎是由许多不同的问题引起的,所以我想我也会把我的案例放在这里。

就我而言,我得到的错误是:

前提条件失败:属性未能设置初始值 - 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 */
    }
}

事后看来似乎很明显,但在坠机发生时获得更多信息会很好。

于 2020-02-26T18:20:51.333 回答
2

我有这个错误。就我而言,这是由于在 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")
  }
}
于 2020-03-14T13:58:54.680 回答
2

在我的情况下,当视图消失时,它正在为绑定属性设置一个值,该属性会像这样更改视图:

  .onDisappear(perform: {
    withAnimation(.easeInOut) {
        self.action.collageWidthSize = 2.0 /* modifies next view border */
      }
   })

在下一个视图的 onAppear 中设置它修复了它:

   .onAppear {
        withAnimation(.easeInOut) {
            self.action.collageWidthSize = 2.0
        }
    }
于 2020-06-28T08:56:48.430 回答
0

好吧,我被这个咬了。Xcode 11.6。

我的观点可能有点令人费解,但我正在做的是,如果用户将视图置于“编辑”模式,所有单元格都会更改其呈现方式。当我切换回来时,我似乎随机地收到了这个错误。我通过删除不必要的绑定来修复它(手指仍然交叉)。我将布尔绑定传递给一些子视图,以便他们知道事物处于什么状态以及如何呈现。问题是,他们不需要响应布尔值的变化,因为无论如何都会重绘父级,它可以重新创建子级。他们不需要被通知他们应该改变状态,他们只是被销毁和重新创建。

于 2020-09-03T23:24:01.910 回答
0

我用作NavigationView的根TabView

NavigationView {
   TabView {
   }
}

然后在TabViewNavigationView也用过,所以由于这个错误。解决方案是只使用一个NavigationView

于 2021-01-29T02:44:11.440 回答