0

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

用户模型

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

用户数据存储

import Combine
class UserDataStore: ObservableObject {

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

内容视图

我使用 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")
                        }
                    })
            }
        }
    }
}

详细视图

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

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

1 回答 1

0

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

您可以使用EnvironmentObject来访问数据ContentViewDetailView

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

destination: DetailView().environmentObject(userStore)

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

@EnvironmentObject var user: UserDataStore
于 2020-09-22T15:09:11.140 回答