我尝试构建一个具有不同横向和纵向布局的视图。
我是这样做的:
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")
}
}
}
不幸的是,单击导航链接时,应用程序崩溃了。
我在做什么错或者这是一个已知的错误?
答案 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)
}
}
}
}