SwiftUI | Изменение параметра EnviromentObject через TextField дочернего View

Нужно изменять значения массива через текстовое поле в дочернем View. @EnviromentObject нужен так как есть функции открытия программы из файла через меню, их @IBAction находится в AppDelegate. Значения массива почему-то не изменяются.

class Command: NSObject, Identifiable
{
    @State var value: String
    var number: Int
}

class Program: NSObject, ObservableObject
{
    @Published var commands: [Command]
}

class AppDelegate
{
    @State var program = Program()

    func applicationDidFinishLaunching()
    {
        ...
        let contentView = ContentView(...)..environment(\.managedObjectContext, persistentContainer.viewContext)
            .environmentObject(program)
        ...
    }
}

struct ContentView: View
{
    @EnviromentObject var program: Program
    
    var body: some View
    {
        ForEach(program.commands) { command in
            CommandView(command.number)
        }
    }
}

struct CommandView: View
{
    var number: Int
    @EnviromentObject var program: Program

    var body: some View
    {
        TextField("0", program.commands[number].$value)
    }
}

Ответы (1 шт):

Автор решения: VAndrJ

@State используется для несколько иных целей. Если хотите использовать такую конструкцию - связывайте с Program:

class Command: NSObject, Identifiable {
    var value: String
...

@EnviromentObject var program: Program

var body: some View {
    TextField("0", $program.commands[number].value)

Либо несколько изменить Command, сделать его ObservableObject и передавать в компонент только нужные данные:

class Command: NSObject, Identifiable, ObservableObject {
    @Published var value: String = ""
...

ForEach(program.commands) { command in
    CommandView().environmentObject(command)
}
...

struct CommandView: View {
    @EnvironmentObject var command: Command
    
    var body: some View {
        TextField("0", text: $command.value)
    }
}
→ Ссылка