SwiftUI:使用空格键在VStack中平均分配多个VStack

时间:2019-09-24 06:25:28

标签: ios swiftui vstack

我正在尝试构建一个VStack(容器),其中包含多个VStack(元素),每个都有一个标题和一个文本。 VStack元素应该均匀分布,并且在它们之间有一个间隔。

由于某种原因,它最多只能使用4个元素的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()
    }
}

1 个答案:

答案 0 :(得分:2)

由于SwiftUI的实现方式,一个视图最多只能有10个直接的显式子视图。您的顶级VStack具有21个直接子视图:10个子VStack和11个Spacer

有多种解决方法。如果您确实需要子视图的硬编码列表,则可以使用Group来使某些子视图成为间接子视图:

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

此处,顶级VStack有6个直接子级:3 Group,2 Spacer和1 VStack。每个Group也有6个直接子级:3个VStack和3个Spacer。视图中没有超过10个直属子项。

一种更好的方法是使用ForEach来生成子代:

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

现在,顶层VStack仅具有两个直接子视图:第一个SpacerForEachForEach根据需要复制其子视图(Group)多次。

在这种情况下,我们使用Group允许Swift推断ForEach主体的类型,因为ForEach主体否则将包含两个语句(VStackSpacer)将阻止Swift推断其类型。