我很高兴这个问题可能会被问很多,我已经看到/尝试了很多答案,但我找不到不涉及传统数组的解决方案。我有一个具有以下结构和示例数据的数据集:
struct Response: Codable {
let status : String
let total, startIndex, pageSize, currentPage, pages: Int
let results: [Result]
}
struct Result: Codable, Identifiable {
let id, sectionName: String
let fields: Fields
}
struct Fields: Codable {
let trailText, bodyText, headline, thumbnail: String
}
Run Code Online (Sandbox Code Playgroud)
示例数据:
{
"status": "ok",
"total": 50,
"startIndex": 1,
"pageSize": 10,
"currentPage": 1,
"pages": 5,
"results": [
"id": "random_id1",
"sectionName": "test",
"fields": [
"headline": "test",
"trailText": "test",
"bodyText": "test",
"thumbnail": "test",
],
"id": "random_id3",
"sectionName": "test",
"fields": [
"headline": "test",
"trailText": "test",
"bodyText": "test",
"thumbnail": "test",
],
]
}
Run Code Online (Sandbox Code Playgroud)
我当前循环遍历列表中的结果以向用户显示信息。一旦用户到达数据末尾,我想调用一个 API 来加载更多数据(无限滚动)。我无法让它在仅加载第一组或一次加载所有数据的情况下工作。
我当前的进度仅在选择最后一行时加载数据,但我想在最后一行出现时立即加载数据。
class Newsfeed: ObservableObject {
@Published var data = [Result]()
func loadData(pageNum: pageNumber) {
// Do API request here and populate data with result
}
}
Run Code Online (Sandbox Code Playgroud)
我的视图具有以下结构:
@ObservableObject var newsfeed = Newsfeed()
@State var page: Int = 1
init() {
newsfeed.loadData(pageNum: page)
}
var body: some View {
List {
ForEach(data) { item in
Text(item.field.headline)
Text(item.field.thumbnail)
Text(item.field.trailText)
Text(item.field.bodyText)
}
}
.onAppear() {
if (self.data.last != nil) {
newsfeed.loadData(pageNum: page + 1)
self.page += 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试过索引方法来检测它当前所在的行,然后将其与数据计数进行比较,但索引不起作用。
如何检测已到达底部并自动加载数据?我的理论是数据最初有 x 个元素。到达最后一行后,我将数据更新为 x + x,但视图保持不变,只有在进入另一个视图并返回时才会更新。
好吧,我想通了,我想我只是调用得onAppear太晚了,应该在 foreach 内调用。我必须更改 dataModel 以使 Result 和 Fields 相等,然后您可以执行以下操作:
List {
ForEach(data) { item in
Text(item.field.headline)
Text(item.field.thumbnail)
Text(item.field.trailText)
Text(item.field.bodyText)
.onAppear(){
if (self.data.last == item){
newsfeed.loadData(pageNum: page + 1)
self.page =+ 1
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3833 次 |
| 最近记录: |