通过索引逐个SwiftUI

问题描述

我试图使用Contentful CMS并遍历数据数组,以便可以在水平图块的“标题”,“样式”和“描述”组中显示它。我能够用硬编码的数据数组来做到这一点,但是我无法用它来做到这一点...

我已经包含了我的View,View Model和Model,因为您会看到该模型包含我的API调用,我的View Model只处理我的可识别数据,然后View自己处理视图。

// MARK: - View

struct BeerListView: View {
    @Observedobject var draftVM = BeerModel()
    
    var body: some View {
        
        
        vstack {
            ForEach(draftVM.draftBeerArray.indices,id: \.self) { item in
                vstack {
                    Text(item.title)
                    Text(item.style)
                    Text(item.description)
                }
            }
        }
    }
}

// MARK: - View Model

struct BeersData: Identifiable {
    var id = UUID()
    var title: String = ""
    var style: String = ""
    var description: String = ""
}

// MARK: - Model

private let client = Client(spaceId: "SPACEID",accesstoken: "SUPERSECRETTOKEN")

func getArray(id: String,completion: @escaping ([Entry]) -> ())  {
    let query = Query.where(contentTypeId: id)
    
    client.fetchArray(of: Entry.self,matching: query) { result in
        switch result {
        case .success( let array):
            dispatchQueue.main.async {
              completion(array.items)
                print(result)
            }
        case.failure(let error):
            print(error)
        }
    }
}


class BeerModel: ObservableObject  {
    @Published var draftBeerArray: [BeersData] = beerArray
        
    init() {
        getArray(id: "beers") { (items) in
            items.forEach { (items) in
                self.draftBeerArray.append(BeersData (
                    title: items.fields["title"] as! String,style: items.fields["style"] as! String,description: items.fields["description"] as! String))
            }
        }
    }
}

解决方法

如果按索引进行迭代,则闭包参数为index,因此您必须按索引访问数组,例如

ForEach(draftVM.draftBeerArray.indices,id: \.self) { index in
    VStack {
        Text(draftVM.draftBeerArray[index].title)

如果要访问项目,则必须按项目进行迭代(它们已经可以识别)

ForEach(draftVM.draftBeerArray,id: \.self) { item in
    VStack {
        Text(item.title)