【问题标题】:How to get on screen rows from List in SwiftUI?如何从 SwiftUI 中的列表中获取屏幕行?
【发布时间】:2020-04-14 01:24:06
【问题描述】:

我正在尝试将Text 为每个可见(在屏幕范围内)行放在所有可见行中它们当前索引的列表中。

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

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

如果我向下滚动列表,然后 A 走出屏幕,那么它会像

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

知道我该怎么做吗?

此外,我曾经使用UITableView.visibleCells 来获取屏幕上的可见单元格,但我在 SwiftUI 中找不到类似的东西。我究竟应该如何在 SwiftUI 中仅提供索引的列表中获得可见行?

希望有人能指导我到正确的地方。非常感谢!

【问题讨论】:

  • 在这种情况下,012 是什么?

标签: ios swift swiftui swiftui-list


【解决方案1】:

您可以使用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)
    }
}

【讨论】:

  • 这真是太棒了!
  • 没想到这个!非常感谢
  • 问题是如果系统做任何缓存,它不会触发onAppear。因此,您查看第 1 项,然后查看第 2 项,onAppear 触发,返回第 1 项,onAppear 不会再次触发。
猜你喜欢
  • 2020-01-03
  • 2022-12-31
  • 2015-07-15
  • 1970-01-01
  • 2023-01-29
  • 1970-01-01
  • 2018-05-22
  • 2020-05-18
  • 2022-07-07
相关资源
最近更新 更多