Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SwiftUI的所有选项卡视图中共享状态_Swift_Xcode_Swiftui - Fatal编程技术网

如何在SwiftUI的所有选项卡视图中共享状态

如何在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

我目前有一个具有4个选项卡视图的应用程序

内容视图

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()