如何从 SwiftUI 中的列表中获取屏幕行?
Posted
技术标签:
【中文标题】如何从 SwiftUI 中的列表中获取屏幕行?【英文标题】:How to get on screen rows from List in 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 中仅提供索引的列表中获得可见行?
希望有人能指导我到正确的地方。非常感谢!
【问题讨论】:
在这种情况下,0
、1
或 2
是什么?
【参考方案1】:
您可以使用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)
【讨论】:
这真是太棒了! 没想到这个!非常感谢 问题是如果系统做任何缓存,它不会触发onAppear
。因此,您查看第 1 项,然后查看第 2 项,onAppear
触发,返回第 1 项,onAppear
不会再次触发。以上是关于如何从 SwiftUI 中的列表中获取屏幕行?的主要内容,如果未能解决你的问题,请参考以下文章