我正在尝试构建一个VStack(容器),其中包含多个VStack(元素),每个都有一个标题和一个文本。元素VStack应该均匀分布并且在它们之间有一个间隔。
由于某种原因,它最多只能使用4个元素的VStack,如果我增加了Vstack,则会收到错误消息
Failed to build ContentView.swift
Ambiguous reference to member 'buildingBlock()'
这是我的代码:
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Spacer()
VStack {
Text("Title 1")
Text("Text 1")
}
Spacer()
VStack {
Text("Title 2")
Text("Text 2")
}
Spacer()
VStack {
Text("Title 3")
Text("Text 3")
}
Spacer()
VStack {
Text("Title 4")
Text("Text 4")
}
Spacer()
VStack {
Text("Title 5")
Text("Text 5")
}
Spacer()
VStack {
Text("Title 6")
Text("Text 6")
}
Spacer()
VStack {
Text("Title 7")
Text("Text 7")
}
Spacer()
VStack {
Text("Title 8")
Text("Text 8")
}
Spacer()
VStack {
Text("Title 9")
Text("Text 9")
}
Spacer()
VStack {
Text("Title 10")
Text("Text 10")
}
Spacer()'
}
.background(Color.red)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
最佳答案
由于SwiftUI的实现方式,一个视图最多只能有10个直接的显式子视图。您的顶层VStack
具有21个直接子视图:10个子VStack
和11个子视图。
有多种解决方法。如果您确实需要一个硬编码的子视图列表,则可以使用Spacer
间接设置一些子视图:
struct ContentView: View {
var body: some View {
VStack {
Group {
Spacer()
VStack {
Text("Title 1")
Text("Text 1")
}
Spacer()
VStack {
Text("Title 2")
Text("Text 2")
}
Spacer()
VStack {
Text("Title 3")
Text("Text 3")
}
}
Group {
Spacer()
VStack {
Text("Title 4")
Text("Text 4")
}
Spacer()
VStack {
Text("Title 5")
Text("Text 5")
}
Spacer()
VStack {
Text("Title 6")
Text("Text 6")
}
}
Group {
Spacer()
VStack {
Text("Title 7")
Text("Text 7")
}
Spacer()
VStack {
Text("Title 8")
Text("Text 8")
}
Spacer()
VStack {
Text("Title 9")
Text("Text 9")
}
}
Spacer()
VStack {
Text("Title 10")
Text("Text 10")
}
Spacer()
}
.background(Color.red)
}
}
在这里,顶级
Group
有6个直接子级:3 VStack
,2 Group
和1 Spacer
。每个VStack
也有6个直接子级:3 Group
和3 VStack
。视图中没有超过10个直接子代。更好的方法是使用
Spacer
生成子代:struct ContentView: View {
var body: some View {
VStack {
Spacer()
ForEach(1 ... 10, id: \.self) { i in
Group {
VStack {
Text("Title \(i)")
Text("Text \(i)")
}
Spacer()
}
}
}
.background(Color.red)
}
}
现在,顶层
ForEach
仅具有两个直接子视图:第一个VStack
和Spacer
。 ForEach
根据需要多次复制其子视图(ForEach
)。在这种情况下,我们使用
Group
允许Swift推断Group
主体的类型,因为否则ForEach
主体将包含两个语句(ForEach
和VStack
),这将阻止Swift推断其类型。关于ios - SwiftUI:使用空格键在VStack中平均分配多个VStack,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58074225/