Как показать список представлений из источника данных, такого как UITableView, в SwiftUI - PullRequest
0 голосов
/ 18 июня 2019

В SwiftUI у нас есть List для представления повторно используемых предметов. Так же, как UITableView в UIKit.

Статические списки создаются следующим образом:

List {
    Text("cell")
    Text("cell")
    Text("cell")
    Text("cell")
}

Но похоже, что не может использоваться повторно вообще

Как мне получить массив некоторых объектов и заполнить список на основе массива и его динамического размера (количества)?

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Ячейка используется повторно.См. Использует ли список в SwiftUI повторное использование ячеек, аналогичных UITableView?

Для статических списков ограничение составляет 10 элементов.Это связано с реализацией ViewBuilder.

extension ViewBuilder {

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

…

extension ViewBuilder {

    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
}

Для использования массива вы можете использовать этот API:


let array = [1,2,3,4]

let listView = List(array) { value in
    Text(value.description)
}

extension List {

extension List {

    /// Creates a List that computes its rows on demand from an underlying
    /// collection of identified data.
    @available(watchOS, unavailable)
    public init<Data, RowContent>(_ data: Data, selection: Binding<Selection>?, rowContent: @escaping (Data.Element.IdentifiedValue) -> RowContent) where Content == ForEach<Data, HStack<RowContent>>, Data : RandomAccessCollection, RowContent : View, Data.Element : Identifiable

…
0 голосов
/ 18 июня 2019

Динамические представления обычно генерируются из динамических данных. Поэтому вам следует рассмотреть возможность использования структуры данных для повторяющихся представлений, а затем построить список на основе данных, подобных этой:

struct Student: Identifiable {
    let name: String
    let id: Int
}

struct ContentView : View {

    // Could be `@State Var` instead
    let students = [
        Student(name: "AAAAA", id: 1),
        Student(name: "BBBBB", id: 2),
        Student(name: "CCCCC", id: 3), // Notice that trailing comma is not problem here? 
    ]

    var body: some View {
        List(students) { student in
            Text(student.name)
        }
    }
}

Массив должен содержать Identifiable объектов (рекомендуется)

или, если вы не предпочитаете соблюдать протокол Identifiable, вы можете использовать его следующим образом:

struct Book {
    let anyPropertyName: String
    let title: String
}

struct ContentView : View {

    // Could be `@State Var` instead
    let books = [
        Book(anyPropertyName: "AAAA", title: "1111"),
        Book(anyPropertyName: "BBBB", title: "2222"),
        Book(anyPropertyName: "CCCC", title: "3333")
    ]

    var body: some View {
        List(books.identified(by: \.anyPropertyName)) { book in
            Text(book.title)
        }
    }
}

Обратите внимание, что dataSource может иметь значение @State var, и это дает возможность обновлять пользовательский интерфейс при любых изменениях @State var.

Наконец, хотя кажется, что это не повторное использование, но на самом деле это так! Ограничение в 10 статических элементов не имеет ничего общего с повторным использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...