Как получить на экране строки из списка в SwiftUI? - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь поместить Text для каждой видимой (в пределах экрана) строки в списке их текущего индекса во всех видимых строках.

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

___|___
A  |  0
B  |  1
C  |  2
-------

И если я прокручиваю список вниз, и А выходит из экрана, тогда он будет как

___|___
B  |  0
C  |  1
D  |  2
-------

Есть идеи, как мне это сделать?

Кроме того, я использовал UITableView.visibleCells для получения видимых ячеек на экране, но я не смог найти что-то похожее в SwiftUI. Как именно я должен получить видимую строку в списке только с указанным в SwiftUI индексом?

Надеюсь, кто-нибудь может направить меня в нужное место. Большое спасибо!

1 Ответ

4 голосов
/ 14 апреля 2020

Вы можете использовать функции onAppear и onDisappear , чтобы вести список видимых строк, а затем использовать их для поиска видимого индекса.

struct ContentView: View {
    let rows = (Unicode.Scalar("A").value...Unicode.Scalar("Z").value)
        .map { String(Unicode.Scalar($0)!) }

    @State var visibleRows: Set<String> = []

    var body: some View {
        List(rows, id: \.self) { row in
            HStack {
                Text(row)
                    .padding(40)
                    .onAppear { self.visibleRows.insert(row) }
                    .onDisappear { self.visibleRows.remove(row) }
            }
            Spacer()
            Text(self.getVisibleIndex(for: row)?.description ?? "")
        }
    }

    func getVisibleIndex(for row: String) -> Int? {
        visibleRows.sorted().firstIndex(of: row)
    }
}
...