我正在努力弄清楚如何在另一个工作表的另一个视图中使用分配给ObservableObject类中的变量的值。我看到它已更新,但是当我在新表的新视图中访问它时,它会重置为初始化值。如何获取它以保留新值,以便可以在新工作表的新视图中使用它?
ContentData.swift
import SwiftUI
import Combine
class ContentData: ObservableObject {
@Published var text: String = "Yes"
}
ContentView.swift
import SwiftUI
struct ContentView: View {
@ObservedObject var contentData = ContentData()
@State private var inputText: String = ""
@State private var showNewView: Bool = false
var body: some View {
VStack {
TextField("Text", text: $inputText, onCommit: {
self.assignText()
})
Button(action: {
self.showNewView = true
}) {
Text("Go To New View")
}
.sheet(isPresented: $showNewView) {
NewView(contentData: ContentData())
}
}
}
func assignText() {
print(contentData.text)
contentData.text = inputText
print(contentData.text)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(contentData: ContentData())
}
}
NewView.swift
import SwiftUI
struct NewView: View {
@ObservedObject var contentData = ContentData()
var body: some View {
VStack {
Text(contentData.text)
}
}
}
struct NewView_Previews: PreviewProvider {
static var previews: some View {
NewView(contentData: ContentData())
}
}
我尝试了许多其他示例中看到的许多不同方法。我尝试使用@EnviromentObject进行此操作,但也无法使其正常工作。我还尝试了其他版本的NewView.swift,在其中使用以下方式初始化值:
init(contentData: ContentData) {
self.contentData = contentData
self._newText = State<String>(initialValue: contentData.text)
}
我想我很亲密,但是我看不到我想念的东西。任何帮助将不胜感激。谢谢。
答案 0 :(得分:2)
@ObservedObject var contentData = ContentData()
上一行中的 ContentData()
创建了ContentData类的新实例。
您应该将相同实例从ContentView传递到NewView以保留值。就像
.sheet(isPresented: $showNewView) {
NewView(contentData: self.contentData)
}
停止在ContentData
中创建NewView
的新实例,并添加从外部注入ContentData
的功能,
struct NewView: View {
@ObservedObject var contentData: ContentData
...
}