Swiftui 运行时错误:前提条件失败:属性未能设置初始值

Swiftui 运行时错误:前提条件失败:属性未能设置初始值,swiftui,navigationlink,Swiftui,Navigationlink,我有一个视图BugSplitView,它单独工作很好,但会导致 前提条件失败:属性未能设置初始值 在预览或模拟器中导航到时出错 该视图的上半部分(颜色)和下半部分(颜色)由水平按钮条分隔,并使用GeometeryReader和拆分状态进行布局。当它是NavigationButton的目标时,它不会在预览中正确显示,并在模拟器中运行时报告上述断言。移除BugButtonBar,它就会工作。把我难住了!救命啊 import SwiftUI struct BugSplitView: View {

我有一个视图
BugSplitView
,它单独工作很好,但会导致

前提条件失败:属性未能设置初始值

在预览或模拟器中导航到时出错

该视图的上半部分(颜色)和下半部分(颜色)由水平按钮条分隔,并使用GeometeryReader和
拆分状态进行布局。当它是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()
        }
    }
}

问题是按钮被声明为computed属性。要解决崩溃问题,请按以下方式声明它们:

var buttons = [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
  .onDisappear(perform: {
    withAnimation(.easeInOut) {
        self.action.collageWidthSize = 2.0 /* modifies next view border */
      }
   })

结果发现问题出在struct Info的id属性上。将其更改为计算属性,如下所示:

var id : String {
   title + imageName
}

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

对我来说,这是导航栏标题中的显示模式。删除它可以解决此问题

撞车

无碰撞

.navigationBarTitle("Title")

既然这个无法直接调试的错误似乎是由许多不同的问题引起的,我想我也应该把我的案例放在这里

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

前提条件失败:属性未能设置初始值-128

问题是,我试图在VStack上呈现一张包含NavigationView的工作表,如下所示:

var主体:一些视图{
VStack(对齐:。中心){
如果/*某些条件*/{
/*其他一些内容*/
}否则{
导航视图{
/*查看内容*/
}
}
}.sheet(显示:/*绑定值*/){
/*纸张内容*/
}
}
修复方法是确保工作表显示在NavigationView上:

var主体:一些视图{
导航视图{
VStack(对齐:。中心){
如果/*某些条件*/{
/*其他一些内容*/
}否则{
/*查看内容*/
}
}
}.sheet(显示:/*绑定值*/){
/*纸张内容*/
}
}

事后看来,这似乎很明显,但如果能在坠机发生时获得更多信息,那就太好了。

我犯了这个错误。在我的例子中,这是由于在if-else语句的两个块中都有一个NavigationView引起的

// bad
if someBool {
  NavigationView {
    Text("some content")
  }
} else {
  NavigationView {
    Text("different content")
  }
}

在我的例子中,它是在视图消失时为绑定属性设置一个值,该属性更改视图,如下所示:

var buttons = [BugButtonBar.Info(title: "title", imageName: "text.insert"){}]
  .onDisappear(perform: {
    withAnimation(.easeInOut) {
        self.action.collageWidthSize = 2.0 /* modifies next view border */
      }
   })
在下一个视图的onAppear中设置此选项修复了此问题:

   .onAppear {
        withAnimation(.easeInOut) {
            self.action.collageWidthSize = 2.0
        }
    }

好吧,我被这个咬了一口。代码11.6


我的视图可能有点复杂,但我要做的是,如果用户将视图置于“编辑”模式,所有单元格都会更改其显示方式。当我切换回来时,我似乎是随机地得到了这个错误。我去掉了一个不必要的装订,把它修好了(手指仍然交叉着)。我将布尔绑定传递到一些子视图中,以便它们知道事物处于什么状态以及如何呈现。问题是,它们不需要对布尔值更改做出响应,因为父对象正在被重新绘制,它可以重新创建子对象。不需要通知它们应该更改状态,它们只是被销毁并重新创建。

我使用
NavigationView
作为
TabView
的根目录:

NavigationView {
   TabView {
   }
}

然后在
选项卡中
我也使用了
导航视图
,因此由于这个错误。解决方案是只使用一个
导航视图

谢谢。我想你的答案和我下面的答案是互补的。由于它是计算出来的,每次新的id都会使swift感到困惑。这种方法的缺点是,操作代码不能引用封闭结构的变量,因为self还不可用。@LuLuGaGa你能解释一下为什么它可以作为一种解决方案吗?在纯swift中,这种更改应该不会影响生成的结构,在SwiftUI中处理这些突变的方式可能存在缺陷。我建议通过SwiftUI下的反馈助手()提交一份bug报告,并使用变通方法,直到我们可以进一步了解。底线:答案是这个问题的合法变通方法,但每次遇到类似的问题时都提交一份bug报告。谢谢!由于某种原因,我只有在启用画外音时才会崩溃,它工作正常。删除displayMode修复了VoiceOver启用时的崩溃。我不知道你是怎么知道的。