首页 > 解决方案 > 如何在 SwiftUI 中获取环境对象数组的索引?

问题描述

我正在努力获取我在 for each 循环中使用的对象的索引。我正在尝试在数组中的每个项目旁边添加一个删除按钮,以从对象数组中删除该项目。所以我会在 for each 循环中有一个按钮,并删除该索引处的项目。

任何帮助将不胜感激 :)

import SwiftUI

struct AddedFoods:Identifiable{
    var name: String = ""
    var totalCals: Double = 0
    var totalProtein: Double = 0
    var totalCarbs: Double = 0
    var totalFat: Double = 0
    var id = UUID().uuidString
   //Your other properties
}


class FoodAddModel: ObservableObject,Identifiable {
    
    @Published var foods : [AddedFoods]?
    
    var id = UUID().uuidString

    init() {
        dummyData()
    }
    
    func dummyData() {
        var obj:[AddedFoods] = []
        obj.append(AddedFoods(name: "Pasta", totalCals: 340, totalProtein: 20, totalCarbs: 45, totalFat: 15))
        obj.append(AddedFoods(name: "Chicken", totalCals: 560, totalProtein: 20, totalCarbs: 45, totalFat: 15))
        obj.append(AddedFoods(name: "Apple", totalCals: 54, totalProtein: 20, totalCarbs: 45, totalFat: 15))
        obj.append(AddedFoods(name: "Noodles", totalCals: 231, totalProtein: 20, totalCarbs: 45, totalFat: 15))
        foods = obj
    }
}

struct myView:View{
    @EnvironmentObject var getFood:FoodAddModel
    @EnvironmentObject var person: UserInfoModel


    var unwrappedFoods:[AddedFoods]{
        getFood.foods ?? []
    }
    
    var body: some View{
        NavigationView{
            
        List{
        ForEach(unwrappedFoods) {obj in
            let b: String = String(obj.totalCals)
            
            List{
                HStack{
                        Text(obj.name)
                        Text(b)
                }
            }
        }.onDelete(perform: { indexSet in
            /*@START_MENU_TOKEN@*//*@PLACEHOLDER=Code@*/ /*@END_MENU_TOKEN@*/
        })

        }
    }
    }
    }

标签: iosswiftswiftui

解决方案


我最喜欢的模式是使用enumerated(). 如果你用一个巨大的列表来做这个,你可能想要做一些性能测试,看看它是否在做额外的工作,而不是仅仅在索引上做 for 循环,但就我的目的而言,它工作得很好:

ForEach(Array(unwrappedFoods.enumerated()), id: \.1.id) { (index, obj) in
            HStack {
                Text(obj.name)
                Spacer()
                Button(action: {
                    //delete with index
                }) {
                    Text("Delete")
                }
            }
        }

objAddedFoods像以前一样为您提供, 并且index(显然)是索引。

id必须使用.1.id,因为.1现在是元组的第二部分(在你的情况下是AddedFoods)。


推荐阅读