检测 SwiftUI 中列表的底部

Nou*_*man 1 swift swiftui

我很高兴这个问题可能会被问很多,我已经看到/尝试了很多答案,但我找不到不涉及传统数组的解决方案。我有一个具有以下结构和示例数据的数据集:

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,但视图保持不变,只有在进入另一个视图并返回时才会更新。

Nou*_*man 6

好吧,我想通了,我想我只是调用得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)