Plenty of features are missing from SwiftUI - it doesn't seem to be possible at the moment.
But here's a workaround.
TL;DR skip directly at the bottom of the answer
An interesting finding whilst doing some comparisons between ScrollView
and List
:
struct ContentView: View {
var body: some View {
ScrollView {
ForEach(1...100) { item in
Text("(item)")
}
Rectangle()
.onAppear { print("Reached end of scroll view") }
}
}
}
I appended a Rectangle
at the end of 100 Text
items inside a ScrollView
, with a print
in onDidAppear
.
It fired when the ScrollView
appeared, even if it showed the first 20 items.
All views inside a Scrollview are rendered immediately, even if they are offscreen.
I tried the same with List
, and the behaviour is different.
struct ContentView: View {
var body: some View {
List {
ForEach(1...100) { item in
Text("(item)")
}
Rectangle()
.onAppear { print("Reached end of scroll view") }
}
}
}
The print
gets executed only when the bottom of the List
is reached!
So this is a temporary solution, until SwiftUI API gets better.
Use a List
and place a "fake" view at the end of it, and put fetching logic inside onAppear { }
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…