gpt4 book ai didi

SwiftUI 在 View 之间共享模型数据

转载 作者:行者123 更新时间:2023-12-04 08:14:57 25 4
gpt4 key购买 nike

我有这样一个结构,这个结构对我来说似乎是错误的,因为我想问你的方法。因此,当我想在 1 个 View 中使用 2 个模型时,我必须将它放在一个 View 中的 foreach 中。这就是我要的。在我想要的其他页面上使用我在用户个人资料中使用的数据。我该怎么做?你们是怎么做到的?
让我举个例子让你更好地理解:
我想在主页上显示我的用户的用户名数据,我应该怎么做?事实上,在初始化我的模型一次之后,我想在其他 View 中使用它。什么是正确的方法。

  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
}

最佳答案

一个可能的解决方案是创建一个 @EnvironmentObject并在根级别注入(inject)它:

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
...

关于SwiftUI 在 View 之间共享模型数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65749608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com