我看过一些类似的问题,但没有一个与我的状态足够接近可以工作。我有 3 个文件:
以前所有 3 中的代码都在一个文件 (ContentView) 中。我现在正在努力将其拆分以使代码更清晰。我是一个相当新手的 iOS 开发人员。我将所有变量移至 VariableSetupModel 并使其正常工作。我引用该文件中的值,它们会更新,然后返回到 ContentView 以更新视图。
现在我正在努力将同一页面上的视图拆分为多个文件,从导航开始。视图显示出来,在页面首次打开时正确地从 VariableSetupModel 读取值。但是当 ContentView 中按钮的值发生变化时,它不会更新 ContentNavView 中视图上的标题。下面是我拥有的代码的简化版本。
内容视图.swift
struct ContentView: View {
//Pull in variables from "VariableSetupModel"
@ObservedObject var viewModel = VariableSetupModel()
@State var counter:Int = 0
var body: some View {
//Main Views
VStack (alignment: .leading) {
// MARK: Climbs-Title
ContentNavView()
}
}
Button(action: {
if viewModel.toggleListGraphs == "graph" {
viewModel.toggleListGraphs = "list"
}else{
viewModel.toggleListGraphs = "graph"
}
}) {
Image(systemName: "list.bullet.below.rectangle")
.font(.title)
}
}
变量设置模型.swift
final class VariableSetupModel: ObservableObject {
static let shared = VariableSetupModel()
//Visuals
@Published var toggleListGraphs = "graph"
}
ContentNavView.swift
struct ContentNavView: View {
//Pull in variables from "VariableSetupModel"
@ObservedObject var viewModel = VariableSetupModel()
//var viewModel = VariableSetupModel.shared
var body: some View {
HStack{
if viewModel.toggleListGraphs == "graph"{
Text("All Sends")
.font(.title)
.padding(.horizontal)
}else{
Text("All Climbs")
.font(.title)
.padding(.horizontal)
}
Spacer()
Button(action: {
viewModel.showSettingsModal = true
}) {
Image("logoIcon")
.renderingMode(.original)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 35, height: 35)
}.padding().foregroundColor(Color("whiteblack"))
}.sheet(isPresented: $viewModel.showSettingsModal, onDismiss: {
//print(viewModel.showSettingsModal)
}) {
SettingsView()
}
}
}
有很多方法可以使viewModel
更改反映在不同的视图中,以下是一个示例,其主要思想是在所有不同的视图中使用一个事实来源:
@StateObject var viewModel = VariableSetupModel()
在ContentView
和@EnvironmentObject var viewModel: VariableSetupModel
在 中声明ContentNavView
。
传递viewModel
fromContentView
到ContentNavView
using .environmentObject(viewModel)
,即添加到ContentView
,例如:VStack (alignment: .leading) {...}.environmentObject(viewModel)
注意,不需要VariableSetupModel
是单例,删除static let shared = VariableSetupModel()
.
另请注意,要使用viewModel
可用SettingsView()
,SettingsView().environmentObject(viewModel)
另一种方法是将 aObservedObject
从一个视图传递到另一个视图。例如:
@StateObject var viewModel = VariableSetupModel()
在ContentView
和
@ObservedObject var viewModel: VariableSetupModel
在 中声明ContentNavView
。
从到使用. viewModel
_ContentView
ContentNavView
ContentNavView(viewModel: viewModel)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句