在新工作表的视图中使用ObservableObject的SwiftUI

时间:2020-04-26 01:02:39

标签: ios xcode swiftui

我正在努力弄清楚如何在另一个工作表的另一个视图中使用分配给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)
    }

我想我很亲密,但是我看不到我想念的东西。任何帮助将不胜感激。谢谢。

1 个答案:

答案 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

        ...
    }