Обновление объекта среды NavigationView

Я пытаюсь создать объект среды, который можно редактировать, и поместить его в список. Переменные обновляются только тогда, когда я, например, переключаю вкладку (так что всякий раз, когда я выхожу из NavigationView), а затем возвращаюсь.

То же самое и раньше работало с ModalView. Может, это ошибка? Или я что-то не так делаю?

import SwiftUI
import Combine

struct TestView: View {

    @State var showSheet: Bool = false
    @EnvironmentObject var feed: TestObject
    func addObjects() {
        var strings = ["one","two","three","four","five","six"]
        for s in strings {
            var testItem = TestItem(text: s)
            self.feed.items.append(testItem)
        }
    }

    var body: some View {
        TabView {
            NavigationView {
                List(feed.items.indices, id:\.self) { i in
                    NavigationLink(destination: detailView(feed: self._feed, i: i)) {
                        HStack {
                            Text(self.feed.items[i].text)
                            Text("(\(self.feed.items[i].read.description))")
                        }
                    }
                }
            }
                .tabItem({ Text("Test") })
                .tag(0)

            Text("Blank")
                .tabItem({ Text("Test") })
                .tag(0)
        }.onAppear {
            self.addObjects()
        }
    }
}

struct detailView: View {
    @EnvironmentObject var feed: TestObject
    var i: Int
    var body: some View {
        VStack {
            Text(feed.items[i].text)
            Text(feed.items[i].read.description)
            Button(action: {  self.feed.items[self.i].isRead.toggle() }) {
                Text("Toggle read")
            }
        }
    }
}

final class TestItem: ObservableObject {
    init(text: String) {
        self.text = text
        self.isRead = false
    }
    static func == (lhs: TestItem, rhs: TestItem) -> Bool {
        lhs.text < rhs.text
    }
    var text: String
    var isRead: Bool

    let willChange = PassthroughSubject<TestItem, Never>()
    var read: Bool {
        set {
            self.isRead = newValue
        }
        get {
            self.isRead
        }
    }
}

class TestObject: ObservableObject {
    var willChange = PassthroughSubject<TestObject, Never>()

    @Published var items: [TestItem] = [] {
        didSet {
            willChange.send(self)
        }
    }
}

person nOk    schedule 30.08.2019    source источник
comment
Я понял. Есть два решения (ну, одно обходное решение и решение)   -  person nOk    schedule 01.09.2019
comment
не могли бы вы поделиться решением с сообществом?   -  person Jonas Deichelmann    schedule 03.09.2020
comment
Пожалуйста, поделитесь лол   -  person gma    schedule 22.06.2021


Ответы (2)


попробуйте передать .environmentObject в пункт назначения:

NavigationLink(destination: detailView(feed: self._feed, i: i).environmentObject(x))
person gma    schedule 22.06.2021

  1. Вы должны использовать willSet вместо didSet.
  2. TestItem должен быть типом значения: структура или перечисление. Система наблюдения SwiftUI правильно работает только с типами значений.
person Mecid    schedule 01.09.2019
comment
ObservableObject использует willSet для вызова objectWillChange.send (). Однако этим занимается @Published. Издатель willChange, похоже, не используется. Система наблюдения SwiftUI работает ТОЛЬКО с классами, IIRC вы не можете объявить структуру как ObservableObject. - person Michael Salmon; 01.09.2019