Как изменить максимальное ограничение количества текста в списке SwiftUI? - PullRequest
0 голосов
/ 18 октября 2019

Я обнаружил проблему, создав новый пустой проект, в списке не более 10 текстовых элементов или произойдет ошибка компиляции. Можно ли изменить ограничение в любом месте?

struct ContentView: View {
    var body: some View {
        List {
            Text("Line 1")
            Text("Line 2")
            Text("Line 3")
            Text("Line 4")
            Text("Line 5")
            Text("Line 6")
            Text("Line 7")
            Text("Line 8")
            Text("Line 9")
            Text("Line 10")

            // Uncomment this line will cause Complie Error
            // Text("Line 11")
        }
    }
}

Я попытался добавитьмодель

class MyModel: ObservableObject {

    @Published var items: [String] = [
        "line 1",
        "line 2",
        "line 3",
        "line 4",
        "line 5",
        "line 6",
        "line 7",
        "line 8",
        "line 9",
        "line 10",
        "line 11",
    ]
}

и отображение списка по данным модели, это исправление отображения

@ObservedObject var model = MyModel()

var body: some View {

    List {
        ForEach(model.items.indices) { index in
            Text(self.model.items[index])
        }
    }
}

Итак, проблема не в списке, это построитель функций?

Обновлен новый метод с использованием Group. Для VStack это нормально, но для List будет отображаться 11 строк, а каждая строка перекрывается строкой 11

List {
    Group {
        Text("Line 1")
        Text("Line 2")
        Text("Line 3")
        Text("Line 4")
        Text("Line 5")
        Text("Line 6")
        Text("Line 7")
        Text("Line 8")
        Text("Line 9")
        Text("Line 10")
    }

    Group {
        Text("Line 11")
    }
}

1 Ответ

1 голос
/ 18 октября 2019

Итак, проблема не в списке, это построитель функций?

Да, именно так. Проблема связана с тем, как реализовано закрытие @ViewBuilder. В настоящее время эти замыкания не могут принимать переменные параметры. Таким образом, они реализуют 10 методов таким образом (вы можете проверить эти интерфейсы в xCode):

/// Builds an empty view from an block containing no statements, `{ }`.
public static func buildBlock() -> EmptyView

/// Passes a single view written as a child view (e..g, `{ Text("Hello") }`) through
/// unmodified.
public static func buildBlock<Content>(_ content: Content) -> Content where Content : View

public static func buildBlock<C0, C1>(_ c0: C0, _ c1: C1) -> TupleView<(C0, C1)> where C0 : View, C1 : View

public static func buildBlock<C0, C1, C2>(_ c0: C0, _ c1: C1, _ c2: C2) -> TupleView<(C0, C1, C2)> where C0 : View, C1 : View, C2 : View

public static func buildBlock<C0, C1, C2, C3>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> TupleView<(C0, C1, C2, C3)> where C0 : View, C1 : View, C2 : View, C3 : View

public static func buildBlock<C0, C1, C2, C3, C4>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4) -> TupleView<(C0, C1, C2, C3, C4)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View

public static func buildBlock<C0, C1, C2, C3, C4, C5>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5) -> TupleView<(C0, C1, C2, C3, C4, C5)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View

public static func buildBlock<C0, C1, C2, C3, C4, C5, C6>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6) -> TupleView<(C0, C1, C2, C3, C4, C5, C6)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View

public static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View

public static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7, C8>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View, C8 : View

public static func buildBlock<C0, C1, C2, C3, C4, C5, C6, C7, C8, C9>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3, _ c4: C4, _ c5: C5, _ c6: C6, _ c7: C7, _ c8: C8, _ c9: C9) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8, C9)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View, C8 : View, C9 : View

Как видите, максимальное количество параметров, которое может принять @ViewBuilder, равно 10.

Решение зависит от ваших потребностей, если представления внутри замыкания в основном одинаковы с разным контентом, вы должны перейти на ForEach внутри List (что в точности предназначено для подобных ситуаций):

struct ContentView: View {
    var body: some View {
        List {
            ForEach { val in
                //your view
            }
        }
    }
}

Если представления действительно представляют собой более 10 различных представлений, вы должны полагаться на представление Group, разделяющее представления на несколько групп:

struct ContentView: View {
    var body: some View {
        ScrollView {
            Group {
                //10 views
            }

            Group {
                //10 views
            }
        }
    }
}
...