如何从SwiftUI中的列表获取屏幕行?

时间:2020-04-14 01:24:06

标签: ios swift swiftui swiftui-list

我试图在所有可见行的当前索引列表中为每个可见行(在屏幕范围内)放置一个Text

我在这里有一个例子。如果我有一个列表一次显示3行,那么最初我希望它显示如下:

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

如果我向下滚动列表,而A退出了屏幕,那么它将像

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

任何想法我该怎么做?

此外,我曾经使用UITableView.visibleCells获取屏幕上的可见单元格,但在SwiftUI中找不到类似的内容。我到底应该如何在SwiftUI中仅提供索引的情况下才能在列表中获得可见行?

希望有人可以将我定向到正确的地方。非常感谢!

1 个答案:

答案 0 :(得分:5)

您可以使用onAppearonDisappear函数维护可见行的列表,然后使用这些行查找可见索引。

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