Как изменить массив StateObject в forEach? - PullRequest
2 голосов
/ 10 июля 2020

У меня есть StateObject, который инициализируется, он содержит массив «Activity», который сам содержит имя свойства, содержащее строку. Когда я повторяю массив в forEach, я пытаюсь изменить имя Activity в другом представлении, но это изменение не отображается в списке. Вот код:

struct ContentView: View {
    @StateObject var store = ActivityStore()
    @State var showAdd = false
    
    var body: some View {
        
        NavigationView {
            
            VStack {
                if store.Activities.isEmpty {
                    
                    Text("Please Add an Activity")
                    
                } else {
                    
                    List {
                        Section(header: Text("Activities: ") ) {
                            
                            
                            ForEach(store.Activities) { activity in
                                
                                NavigationLink( destination: DetailView(activity: activity))
                                {
                                    
                                    Text(verbatim: activity.name)
                                }
                                
                            }
                        }
                    }
                    
                    
                }
                
            }
            .navigationTitle("ITrack")
            .navigationBarItems(trailing: Button(action: { showAdd = true }) {
                Text("Add")
            })
            .sheet(isPresented: $showAdd) {
                AddView(store: store)
            }
        }
    }
}


struct DetailView: View {
    
   
    @Binding var activity: Activity
    
    var body: some View {
        VStack {
    
            TextField("name", text: $activity.name )
            Text(activity.description)
            
            
        }
    }
}


struct Activity: Identifiable {
    var id = UUID()
    
    var name: String
    var description: String
    
    var log: [String] = []
    
    
    init(name: String, description: String) {
        self.name = name
        
        self.description = description
       
        
    }
}


class ActivityStore: ObservableObject {
    
    @Published var Activities: [Activity] = []
    

    
    func demo() -> [Activity] {
        let activities: [Activity] = []
        
        Activities.append(Activity(name: "br1", description: "br111111"))
        Activities.append(Activity(name: "br2", description: "br222222"))
        Activities.append(Activity(name: "br3", description: "br333333"))
        Activities.append(Activity(name: "br4", description: "br444444"))
        
        return activities

    }
    
}

1 Ответ

0 голосов
/ 10 июля 2020

Здесь необходимы обновления

1)

struct Activity: Identifiable, Hashable {
ForEach(Array(store.Activities.enumerated()), id: \.1) { i, activity in
    NavigationLink( destination: DetailView(activity: $store.Activities[i]))
    {
        Text(verbatim: activity.name)
    }
}
...