SwiftUI: обновите массив ObservableObject в подробном TabView, чтобы обновить основной ListView

Я новичок в программировании и SwiftUI, так что это будет основным. (этот код представляет собой комбинацию различных ObservableObject руководств, которые я нашел, поэтому есть ненужные / неправильные шаги, на самом деле все может быть неправильным). Любая помощь приветствуется!

У меня есть основной список из четырех строк «переключателей», каждая из которых имеет свойство switchTask. Подробное представление - это вкладка с несколькими экранами. Когда пользователь обновляет switchTask в каких-либо подробных представлениях вкладок, мне нужно, чтобы это свойство задачи обновлялось в основном представлении списка для соответствующего SwitchRow.

Мой ObservableObject - это массив switches. Мне сложно понять, как правильно передать каждый экземпляр Switch в сведения о Tabview (PluggedInDetail), чтобы обновить соответствующий switchTask в основном списке. Должен ли я использовать вместо этого EnvironmentObject?

ObservableObject и Row:

import SwiftUI
import Combine

class Switch: ObservableObject, Identifiable {

    let id = UUID()
    @Published var switchName: String
    @Published var switchTask: String

    init (switchName: String, switchTask: String) {
         self.switchName = switchName
         self.switchTask = switchTask
   }
}

class Switches: ObservableObject {

    //private init() { }
    static let shared = Switches()

    @Published var switches: [Switch]

    init() {
        //switchTask is to be updated on tabview detail
        self.switches = [
        Switch(switchName: "Switch Input 1", switchTask: ""),
        Switch(switchName: "Switch Input 2", switchTask: ""),
        Switch(switchName: "Switch Input 3", switchTask: ""),
        Switch(switchName: "Switch Input 4", switchTask: "")]
    }
}
struct SwitchRow: View {
  
    @ObservedObject var myswitch: Switch

    var body: some View {
        HStack{
            Image(systemName: "circle")
            VStack{
                Text(myswitch.switchName)
                Text(myswitch.switchTask)
           }
        }
    }
}

ContentView:

struct ContentView: View {

    @ObservedObject var myswitches: Switches = .shared

    var body: some View {
        NavigationView{
            VStack {
                List(Array(myswitches.switches.enumerated()), id: \.element.id) { (i, Switch) in
                    NavigationLink(destination: tabDetail()){
                        SwitchRow(myswitch: self.myswitches.switches[i])
                    }
                }
            }
        }
    }
}
struct tabDetail: View {

    @ObservedObject var detailSwitches: Switches = .shared

    var body: some View {
        TabView {
            PluggedInDetail()
                .tabItem {
                    Text("Plugged In")
            }

            TVDetail()
                .tabItem {
                    Text("TV")
            }
        }
    }
}

Подробное представление: (в настоящее время жестко запрограммирован элемент массива для обновления для Switch Input 1. Здесь мне нужна помощь)

import SwiftUI 
import Combine

struct PluggedInDetail: View {

    @ObservedObject var detailSwitches: Switches = .shared

    var body: some View {
        VStack {
            // switchName should display in the text
            Text(self.detailSwitches.switches[0].switchName)
            Button(action: {
                        //This should update switchTask for whichever switch element is selected
                        self.detailSwitches.switches[0].switchTask = "Direct Press"  
                    }) {
                        Text("Add Direct Press")
                   }
                }
            }
        }

person RachelS    schedule 18.12.2020    source источник