使用 ObservableObject 关键字传递数据

Passing data with ObservableObject keyword

如何使用 ObservableObject 关键字将数据移动到其他屏幕? 我将第一页的数据保存到我用关键字 Published 创建的变量中,但我无法在第二页访问此数据。

用户模型

import Combine
struct User: Codable, Identifiable {
    
    var id = UUID()
    var name: String
    var surName: String
    
}

UserDataStore

import Combine
class UserDataStore: ObservableObject {

    @Published var users: [User] = []
    
}

ContentView

我使用 contentView 屏幕上的 TextField 对象从用户处获取信息。按下按钮后,我将其添加到 UserDataStore 中的数组中。我重定向到详细信息页面。

struct ContentView: View {
    @State var name: String = ""
    @State var surName: String = ""
    @State var user = User(name: "", surName: "")
    @State var show: Bool = false
    
    @ObservedObject var userStore = UserDataStore()
    
    var body: some View {
        
        NavigationView {
            VStack(spacing: 50) {
                TextField("isim", text: $name)
                TextField("soyİsim", text: $surName)
                
                NavigationLink(
                    destination: DetailView(),
                    isActive: $show,
                    label: {
                        Button(action: {
                            self.user.name = name
                            self.user.surName = surName
                            self.userStore.users.append(user)
                            self.show = true
                            
                        }) {
                            Text("Kaydet")
                        }
                    })
            }
        }
    }
}

DetailView

在详情页面,我尝试查看记录的信息,但是我不能。

struct DetailView: View {
    @ObservedObject var user = UserDataStore()
    
    var body: some View {
        ForEach(user.users) { item in
            Text("\(item.name)")
        }
    }
}

就像@“New Dev”解释的那样,您正在初始化 UserDataStore 的新实例,因此无法从 DetailView.

访问您的数据

您可以使用 EnvironmentObject 访问从 ContentViewDetailView 的数据。

为此,您必须将 NavigationLink 的目的地设置为:

destination: DetailView().environmentObject(userStore)

然后您可以像这样从 DetailView 访问它:

@EnvironmentObject var user: UserDataStore