SwiftUI: распределите одинаково несколько VStacks в VStack с помощью проставок - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь построить VStack (контейнер), содержащий несколько VStacks (элемент) с каждым заголовком и текстом.Элемент VStacks должен быть распределен равномерно и иметь разделитель между ними.

По какой-то причине он работает только до 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 Ответ

2 голосов
/ 24 сентября 2019

Из-за способа реализации 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 есть только дваПрямые подпредставления: первые Spacer и ForEach.ForEach повторяет свое подпредставление (Group) столько раз, сколько необходимо.

Мы используем Group в этом случае, чтобы позволить Swift выводить тип тела ForEach, так какВ противном случае тело ForEach будет содержать два оператора (VStack и Spacer), которые не позволят Swift определить его тип.

...