SwiftUI因“前提条件失败:属性无法设置初始值:85”而崩溃

时间:2020-06-12 15:07:14

标签: swift swiftui

我尝试构建一个具有不同横向和纵向布局的视图。

我是这样做的:

class ViewModel : ObservableObject
{
    @Published var name  = "Name"
}

struct ContentView: View {
  var body: some View {
    NavigationView{
      List{
        NavigationLink(destination: TEST(vm: ViewModel() ) ){Text ("TEST")}
      }
    }
  }
}

struct TEST: View {
  @ObservedObject var vm : ViewModel

  var body: some View {
    GeometryReader{ geometry in
      if  geometry.size.height > geometry.size.width {
        TEST_Vertical(vm: self.vm)
      } else {
        TEST_Horicontal(vm: self.vm)
      }
    }
  }
}

struct TEST_Horicontal: View {
  @ObservedObject var vm : ViewModel

    var body: some View {
      HStack{
        Text("left \(vm.name)")
        Spacer()
        Text("right")
      }
    }
  }

struct TEST_Vertical: View {
  @ObservedObject var vm : ViewModel
  var body: some View {
    VStack{
      Text("top")
      Text("\(vm.name)")
      Spacer()
      Text("bottom")
    }
  }
}

不幸的是,单击导航链接时,应用程序崩溃了。

我在做什么错或者这是一个已知的错误?

1 个答案:

答案 0 :(得分:1)

之所以会发生崩溃,是因为在NavigationLink过渡开始时GeometryReader返回了CGSize.zero,并且在下一个更新阶段中,实际大小已更改,因此即时更改了体内视图,而不是预期。可能是错误。

您可能会考虑以下解决方法(或类似的方法,例如有条件地使用.hidden())。在Xcode 11.4 / iOS 13.4上进行了测试(我不急于进行环境更新)。

struct TEST: View {
  @ObservedObject var vm : ViewModel

  var body: some View {
    GeometryReader{ geometry in
        ZStack {
            TEST_Vertical(vm: self.vm)
               .opacity(geometry.size.height >= geometry.size.width ? 1 : 0)
            TEST_Horicontal(vm: self.vm)
              .opacity(geometry.size.height < geometry.size.width ? 1 : 0)
        }
    }
  }
}