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

Posted

技术标签:

【中文标题】SwiftUI 因“前提条件失败:属性未能设置初始值:85”而崩溃【英文标题】:SwiftUI crashes with "precondition failure: attribute failed to set an initial value: 85" 【发布时间】:2020-06-12 15:07:14 【问题描述】:

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

我是这样做的:

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")
    
  


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

我做错了什么还是这是一个已知的错误?

【问题讨论】:

当您在 ContentView 中保留对 ViewModel 的引用时会发生什么,即 let model = ViewModel() 并将其传递给 TEST 您的代码适用于我在 iPhone 11 Pro 模拟器、Xcode 11.5、Swift 5.2 上。你在用什么? @WarrenBurton:还是同样的崩溃 @pawello2222。 Xcode:Version 11.5 (11E608c), iPhone SE Simulator, swift 5.(我在哪里可以看到 swift 次要版本?) 你可以在终端使用swift --version查看swift版本 【参考方案1】:

发生崩溃是因为在NavigationLink 转换开始时GeometryReader 返回CGSize.zero 并且在下一个更新阶段实际大小,因此体内视图会即时更改,这不是预期的。应该是bug吧。

您可以考虑以下解决方法(或类似的方法,例如,有条件地使用.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)
        
    
  

【讨论】:

以上是关于SwiftUI 因“前提条件失败:属性未能设置初始值:85”而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI Preview 因 *** 崩溃

SwiftUI Preview 因链接器错误而失败

SwiftUI Preview 因 Core Data 'NSInvalidArgumentException' 而崩溃

当视图模型@Published 更改时,SwiftUI 列表因“NSRangeException”而崩溃

SwiftUI 冻结设备

SwiftUI @EnvironmentObject:未找到?