[英]SwiftUI Sharing model data between views
I have such a structure, this structure seems wrong to me as the approach I want to ask you.我有这样一个结构,这个结构对我来说似乎是错误的,因为我想问你的方法。 So when I want to use 2 models in 1 view, I have to put it in foreach in one view.因此,当我想在 1 个视图中使用 2 个模型时,我必须将它放在一个视图中的 foreach 中。 This is what I want.这就是我要的。 Using the data I use in my user's profile on other pages I want.在我想要的其他页面上使用我在用户个人资料中使用的数据。 How should I do this?我该怎么做? How do you guys do it?你们是怎么做到的?
Let me give an example for your better understanding:让我举个例子让你更好地理解:
I want to show my user's Username data on the Homepage, how should I do this?.我想在主页上显示我的用户的用户名数据,我应该怎么做? In fact, after initializing my model once, I want to use it in other views.其实我的model初始化一次后,想在其他视图中使用。 What is the right approach.什么是正确的方法。
import SwiftUI
struct ContentView: View {
@StateObject var network = ProfileNetwork()
var body: some View {
TabView{
ProfileView().tabItem { Image(systemName: "house") }
ForEach(self.network.userprofile,id:\.id){a in
ShopView(profile_model: a)
}.tabItem { Image(systemName: "house") }
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class ProfileNetwork : ObservableObject {
@Published var userprofile : [UserPRofile] = [UserPRofile(name: "Test", coin: 1, id: "dsa")]
}
struct ProfileView : View {
@StateObject var network = ProfileNetwork()
var body: some View {
ForEach(self.network.userprofile, id:\.id){ i in
ProfileViewModel(profile_model: i)
}
}
}
struct ProfileViewModel : View {
var profile_model : UserPRofile
var body: some View {
Text(self.profile_model.name)
}
}
struct UserPRofile : Decodable{
var name : String
var coin : Int
var id : String
}
class ShopeNetwork : ObservableObject {
@Published var shop : [ShopStore] = [ShopStore(id: "sda", image: "dasd", price: 100, name: "sda")]
}
struct ShopView : View {
@StateObject var network = ShopeNetwork()
var profile_model : UserPRofile
var body: some View {
ForEach(self.network.shop, id:\.id){ c in
ShopViewModel(shop_model: c, profile_model: profile_model)
}
}
}
struct ShopViewModel : View {
var shop_model : ShopStore
var profile_model : UserPRofile
var body: some View {
Text(profile_model.name)
Text(self.shop_model.name)
}
}
struct ShopStore : Decodable {
var id : String
var image : String
var price : Int
var name : String
}
A possible solution is to create an @EnvironmentObject
and inject it at the root level:一种可能的解决方案是创建一个@EnvironmentObject
并将其注入根级别:
class AppState: ObservableObject {
@Published var userProfile: UserPRofile?
}
@main
struct TestApp: App {
@StateObject private var appState = AppState()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(appState)
}
}
}
struct ProfileView: View {
@EnvironmentObject private var appState: AppState // access as an `@EnvironmentObject`
@StateObject var network = ProfileNetwork()
var body: some View {
VStack {
ForEach(self.network.userprofile, id: \.id) { i in
ProfileViewModel(profile_model: i)
}
}
.onAppear {
appState.userProfile = network.userprofile.first // set `userProfile` globally
}
}
}
struct ShopView: View {
@EnvironmentObject private var appState: AppState // use it in any other view
...
Swift 5, iOS 14 Swift 5、iOS 14
Make the class a singleton so it becomes shareable easily.将 class 设为 singleton,以便轻松共享。
class ProfileNetwork : ObservableObject {
@Published var userprofile : [UserPRofile] = [UserPRofile(name: "Test", coin: 1, id: "dsa")]
static var shared = ProfileNetwork()
}
And then refer to it with the shared handle.然后使用共享句柄引用它。
struct ContentView: View {
@StateObject var network = ProfileNetwork.shared
var body: some View {
....
}
struct ProfileView : View {
@StateObject var network = ProfileNetwork.shared
var body: some View {
....
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.