SwiftUI:当观察到的对象从另一个文件更改时,视图不更新

吉尔伯特奥斯本

我看过一些类似的问题,但没有一个与我的状态足够接近可以工作。我有 3 个文件:

  1. 内容视图.swift
  2. 变量设置模型.swift
  3. ContentNavView.swift

以前所有 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

传递viewModelfromContentViewContentNavViewusing .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_ContentViewContentNavViewContentNavView(viewModel: viewModel)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SwiftUI 从另一个视图更改观察到的对象

将可观察到的嵌套对象映射到另一个对象

rxjava按条件收集对象并等待另一个可观察到的对象

当观察到更改时,React Mobx componentDidUpdate不更新

当观察到的对象更改时,Swift View 不会更新

RxJava-控制一个可被另一个观察到

如何将数据从观察到的类传递到另一个类?

SwiftUI 未在观察对象更改时更新视图

RxJava:等待另一个可观察到的结果

当另一个发出值时,可观察到RxJS错误

根据另一个对Rx可观察到的Rx进行升采样

* ng如果异步管道与另一个可观察到的角度合并

SwiftUI 观察到的对象未更新

将对象详细信息传递到另一个视图 [SwiftUI]

当其ViewModel可观察到的更改时,淘汰表组件视图未更新

将一个可观察到的称为另一个是正确的吗?

通过另一个文件中的函数更新swiftui文本视图

将可观察到的Zip列表转换为另一个可观察到的RxJava2

在更改时将所有文件更改从一个文件夹连续复制到另一个文件夹(Windows)

将MergeMap与从另一个可观察到的数据数组一起使用-RxJs Angular

更新useState而不插入另一个对象

当“ view.rx.isHidden”已更改时,如何发出单个通知另一个视图,我是否可以观察“ view.rx.isHidden”?

用另一个可观察对象更改一个可观察对象的订阅状态

延迟发射物品,直到从另一个可观察到的物品发射出来

RxJava:取消订阅可从另一个异步生产中观察到的异步

RXJS首先发出结果,然后等待另一个可观察到的结果

Formik表单更改时更新另一个组件

当另一个集合中发生更改时,MongoDB集合的动态更新

vue.js在另一个值更改时更新值(数据绑定)