如何在SwiftUI的所有选项卡视图中共享状态
我目前有一个具有4个选项卡视图的应用程序 内容视图:如何在SwiftUI的所有选项卡视图中共享状态,swift,xcode,swiftui,Swift,Xcode,Swiftui,我目前有一个具有4个选项卡视图的应用程序 内容视图: import SwiftUI struct ContentView: View { init() { //Setting appearance of UI colour UITabBar.appearance().backgroundColor = ColourManager.UIColour1 } var body: some View { TabView { Pr
import SwiftUI
struct ContentView: View {
init() {
//Setting appearance of UI colour
UITabBar.appearance().backgroundColor = ColourManager.UIColour1
}
var body: some View {
TabView {
ProfileView().tabItem ({
Text("Profile")
}).tag(0)
TrackerView().tabItem ({
Text("Tracker")
}).tag(1)
ProgressView().tabItem ({
Text("Progress")
}).tag(2)
MealView().tabItem ({
Text("Meals")
}).tag(3)
}.accentColor(ColourManager.Colour3)
}
}
我有下面的课程,这是我的模式:
import Foundation
class UserInfoModel: ObservableObject {
struct UserInfo: Identifiable {
var id = UUID()
var height: Int
var weight: Int
var gender: String
var age: Int
}
struct DailyCalorieGoals: Identifiable{
var id = UUID()
var calorieGoal: Int
var fatGoal: Int
var proteinGoal: Int
var carbGoal: Int
}
struct CurrentCalorieProgress: Identifiable{
var id = UUID()
var calorieProgress: Int
var fatProgress: Int
var proteinGoal: Int
}
@Published var person1 = UserInfo.init(height: 20, weight: 30, gender: "male", age: 5)
}
现在我尝试创建这个类的一个实例,让我的所有视图使用Observable object访问同一个对象,但是在我的第一个视图中,我将权重设置为一个新值,以检查它是否在我的其他视图中保持该状态:
ProfileView
@ObservedObject var person = UserInfoModel()
var body: some View {
Button(action: {
print(self.person.person1.weight)
self.person.person1.weight = 100
print(self.person.person1.weight)
}) {
Text("Button")
}
.foregroundColor(ColourManager.Colour1)
}
}
这会将权重的值更改为100,但当我转到另一个选项卡屏幕并再次实例化对象时,该值会返回到模型类中声明的值:
@ObservedObject var person = UserInfoModel()
var body: some View {
Button(action: {
print(person.person1.weight)
}) {
Text("Button")
}
.foregroundColor(ColourManager.Colour1)
}
}
所以我基本上只想实例化一个对象,并且能够操作它,更改所有视图中的值,并自动更新UI,任何帮助都将不胜感激 这是因为您正在为每个视图创建一个新的
UserInfoModel
实例。。必须在第一个视图中创建一次,并将其作为参数甚至作为环境对象传递给子视图
@ObservedObject var person: UserInfoModel //<< just declare typ and pass it from main view
@ObservedObject var person:UserInfoModel/这是因为您正在为每个视图创建一个新的UserInfoModel
实例。。必须在第一个视图中创建一次,并将其作为参数甚至作为环境对象传递给子视图
@ObservedObject var person: UserInfoModel //<< just declare typ and pass it from main view
@ObservedObject var person:UserInfoModel/1。使用ObservedObject
@ObservedObject
用于跟踪已创建的对象,可能使用@StateObject
您必须在ContentView
中创建person
变量,其中创建了TabView
@StateObject var person = UserInfoModel()
并将其作为参数从选项卡视图传递给每个视图
ProfileView(person: person).tabItem ({
Text("Profile")
}).tag(0)
现在,在每个视图中删除person
变量的实例化,只保留声明
@ObservedObject var person: UserInfoModel
2。使用环境对象
@EnvironmentObject
建议用于需要使用@observeobject
但视图不是直接父/子对的场景。
在应用程序
文件中,您必须创建个人
对象:
@StateObject var person = UserInfoModel()
然后将其传递到ContentView
,如下所示:
ContentView().person(person)
要在ContentView
中的任何视图中使用该对象,请执行以下操作:
@EnvironmentObject var person: UserInfoModel
1。使用ObservedObject
@ObservedObject
用于跟踪已创建的对象,可能使用@StateObject
您必须在ContentView
中创建person
变量,其中创建了TabView
@StateObject var person = UserInfoModel()
并将其作为参数从选项卡视图传递给每个视图
ProfileView(person: person).tabItem ({
Text("Profile")
}).tag(0)
现在,在每个视图中删除person
变量的实例化,只保留声明
@ObservedObject var person: UserInfoModel
2。使用环境对象
@EnvironmentObject
建议用于需要使用@observeobject
但视图不是直接父/子对的场景。
在应用程序
文件中,您必须创建个人
对象:
@StateObject var person = UserInfoModel()
然后将其传递到ContentView
,如下所示:
ContentView().person(person)
要在ContentView
中的任何视图中使用该对象,请执行以下操作:
@EnvironmentObject var person: UserInfoModel
这是否回答了您的问题?这是否回答了您的问题?我将在名为*YourApplicationName*
App.swift的文件中放置ContentView().person(person)@Matthew在哪里,在名为*YourApplicationName*
App.swift的文件中,我将在哪里放置ContentView().person(person)@Matthew,其中已被称为ContentView()