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)
}
}