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 因 Core Data 'NSInvalidArgumentException' 而崩溃