Swiftui 刷新NavigationView环境对象

Swiftui 刷新NavigationView环境对象,swiftui,swiftui-list,Swiftui,Swiftui List,我正在尝试创建一个可编辑的环境对象,并将其放入列表中。 例如,只有当我切换选项卡(因此每当我离开NavigationView)然后返回时,变量才会刷新 这同样适用于以前的ModalView。可能是虫子吧?还是我做错了什么 import SwiftUI import Combine struct TestView: View { @State var showSheet: Bool = false @EnvironmentObject var feed: TestObject

我正在尝试创建一个可编辑的环境对象,并将其放入列表中。 例如,只有当我切换选项卡(因此每当我离开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)
        }
    }
}
导入快捷界面
进口联合收割机
结构测试视图:视图{
@状态变量显示表:Bool=false
@EnvironmentObject变量提要:TestObject
func addObjects(){
变量字符串=[“一”、“二”、“三”、“四”、“五”、“六”]
对于字符串中的字符串{
var testItem=testItem(文本:s)
self.feed.items.append(testItem)
}
}
var body:一些观点{
TabView{
导航视图{
列表(feed.items.index,id:\.self){i在
导航链接(目的地:详细视图(提要:self.\u提要,i:i)){
HStack{
Text(self.feed.items[i].Text)
文本(\(self.feed.items[i].read.description)))
}
}
}
}
.tabItem({Text(“Test”)})
.tag(0)
文本(“空白”)
.tabItem({Text(“Test”)})
.tag(0)
}奥纳佩尔先生{
self.addObjects()
}
}
}
结构详细视图:视图{
@EnvironmentObject变量提要:TestObject
变量i:Int
var body:一些观点{
VStack{
文本(提要.items[i].Text)
文本(feed.items[i].read.description)
按钮(操作:{self.feed.items[self.i].isRead.toggle()}){
文本(“切换读取”)
}
}
}
}
最终类测试项:ObservieObject{
初始化(文本:字符串){
self.text=文本
self.isRead=false
}
静态函数==(左:测试项,右:测试项)->Bool{
lhs.text
  • 你必须使用willSet而不是didSet
  • TestItem应为值类型:struct或enum。SwiftUI的观察系统仅适用于值类型

  • 我想出来了。有两个解决方案(一个解决方案和一个解决方案),您是否可以与社区共享该解决方案?ObserveObject使用willSet调用objectWillChange.send()。这是由@Published处理的。willChange发布服务器似乎未使用。SwiftUI的观察系统只适用于类,IIRC不能将结构声明为ObserveObject。