【问题标题】:SwiftUI MVVM how to iterate and get index of arraySwiftUI MVVM如何迭代并获取数组的索引
【发布时间】:2021-04-17 09:24:37
【问题描述】:

我的项目正在创建一个订购应用程序,在这个关于菜单详细信息的屏幕中,有用户可以选择/附加的菜单变体,我需要迭代 [MenuDetailVariantGroup] 数组并且我需要获取索引数组,我该怎么做?在 for 循环中,我还需要将变量附加到 @Published var variantChosen,但是如果我执行 self.viewModel.variantChosen.append(1),它总是会返回错误。以下是我的代码:

MenuDetailData.swift

struct MenuDetailData: Codable, Identifiable {
    let id = UUID()
    let idMenu: String
    let menuName: String
    let variantGroup: [MenuDetailVariantGroup]
}

MenuDetailVariantGroup.swift

struct MenuDetailVariantGroup: Codable, Identifiable, Hashable {
    let id = UUID()
    let variantGroupName: String
    let variant: [MenuDetailVariant]
    let limit: Int
}

MenuDetailVariant.swift

struct MenuDetailVariant: Codable, Identifiable, Hashable {
    let id = UUID()
    let variantName: String
}

MenuDetailViewModel.swift

class MenuDetailViewModel: ObservableObject, MenuDetailService {
    var apiSession: APIService
    @Published var detaildata: MenuDetailData?
    @Published var variantGroup = [MenuDetailVariantGroup]()
    @Published var variantChosen: Array<Int> = []
    
    var cancellables = Set<AnyCancellable>()
    
    init(apiSession: APIService = APISession()) {
        self.apiSession = apiSession
    }
    
    func getMenuDetail() {
        let cancellable = self.getMenuDetail()
            .sink(receiveCompletion: { result in
                switch result {
                case .failure(let error):
                    print("Handle error: \(error)")
                case .finished:
                    break
                }
                
            }) { (detail) in
                self.detaildata = detail.data
                self.variantGroup = detail.data.variantGroup
        }
        cancellables.insert(cancellable)
    }
    
}

菜单详细视图

struct MenuDetailView: View {
    @ObservedObject var viewModel = MenuDetailViewModel()
    
    var body: some View {
        ForEach(self.viewModel.variantGroup, id: \.self) { vg in
                /*** I Need to get the index of each iteration here, how? ***/
                VStack {
                    HStack {
                        Text(vg.variantGroupName)
                        Text(String(self.viewModel.arrVariantChoosen[0]))
                    }
                    VStack {
                        ForEach(vg.variant, id: \.self) { v in
                            Text(v.variantName)
                        }
                    }
                }
                // I also need to append Int to @Published var variantChosen
                self.viewModel.variantChosen.append(1)
                // This always return error:
                // Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols
            }
        }
    }
}

这是我迄今为止尝试过但失败并返回空的代码

// This returns blank
ForEach(0..<self.viewModel.variantGroup.count) { i in
    Text("\(self.viewModel.variantGroup[i].variantGroupName)")
}

// This too returns blank
ForEach(self.viewModel.variantGroup.indices) { i in
    Text("\(self.viewModel.variantGroup[i].variantGroupName)")
}

提前谢谢大家

【问题讨论】:

  • 您尝试过的应该可以正常工作,例如参见this answer。也许数组是空的?您的视图模型中有一个方法getMenuDetail,但它曾经被调用过吗?
  • 它确实被调用了,当前的 "ForEach(self.viewModel.variantGroup, id: \.self) { vg in" 返回数据,但我无法获得索引,奇怪的是"ForEach(0..
  • 另外,为什么该方法会调用自己?但也许你现在应该忽略这个函数,将一些值硬编码到 variantGroup 数组中,看看你是否可以让 ForEach 工作,这样你就可以一次处理一个问题。

标签: arrays swift swiftui swiftui-list


【解决方案1】:

你可以使用枚举来同时拥有索引和元素,比如

    var body: some View {
        ForEach(Array(self.viewModel.variantGroup.enumerated()), id: \.1) { index, vg in
                /*** I Need to get the index of each iteration here, how? ***/
                VStack {

【讨论】:

  • 非常感谢您,这确实有效,但是如何将值附加到 ViewModel 中的数组 @Published var variantChosen 在 foreach 循环中选择?
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 2014-10-28
  • 2020-05-21
  • 1970-01-01
  • 2022-12-20
  • 2019-07-26
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多