如何在SwiftUI上的observableobject中使用observableobject类?

vxbzzdmp  于 2023-01-12  发布在  Swift
关注(0)|答案(2)|浏览(182)

我附上了一张照片。请看。

据我所知,“视图”只是视图,而不是控制器。所以我像方法1一样开发。但我面临一个问题,我如何在另一个可观察对象中使用可观察对象?
我想如果我用observableobject传递一个参数,问题就会解决。但是我认为这是不好的方法。
所以我想到了方法2。但是方法是“视图”不仅仅是视图。它是视图和控制器。
所以我搞不清这条路是不是坏的。
哪种方式是好的方式?我想知道其他SwiftUI开发人员如何开发这种情况。
如果你认为有比方法1和方法2更好的方法,请给我建议。

摘要

问题1.方式1-我怎样在另一个可观察对象中使用可观察对象?(单音?类似静态共享)
Q2. Way 2-方向是否正确?(视图=视图+控制器)
Q3.您的建议。

环境

xcode 14.2
斯威夫特5.7.2

iszxjhcz

iszxjhcz1#

下面是您的问题的示例代码:

struct MainView: View {
     @StateObject var mainVM = MainViewModel()
     @ObservedObject var discoveryVM:DiscoveryViewModel

     var body: some View {
           ZStack {
                ScrollView {
                     // if data changed in DiscoveryViewModel view will automatically upadte
                     ForEach(discoveryVM.showProfiles, id: \.self) { profile in
                          MyView(profile: Profile)
                     }
                }
           }
           .onReceive(discoveryVM.$toggle) { status in 
           // change something in MainViewModel when toggle in DiscoveryViewModel
                mainVM.toggle = status // change variable(rearly used)
                mainVM.doSomething() // call fucntions
           }
     }
}

class MainViewModel: ObservableObject {
     @Published var toggle: Bool = false
     
     func doSomething() {
        print("Do something")
     }
}


class DiscoveryViewModel: ObservableObject {
     @Published var data: [ProfileModel] = []
     @Published var toggle: Bool = false
}

ObservableObjects主要用于视图嵌套的情况

ffdz8vbo

ffdz8vbo2#

SwiftUI是一个新的架构,旧的设计模式并不适合。在SwiftUI中,View结构体不是MVC意义上的视图。该视图层(例如,UIView/NSView对象)是基于View结构体的差异自动生成的,这些结构体是超快速高效的值类型。视图状态保存在@State之类的属性 Package 器中,这实质上使值的行为类似于对象,例如,它有一个“内存”。您可以将其作为let(用于读访问)或@Binding var(用于写访问)向下传递到子视图,SwiftUI将跟踪依赖关系,并在必要时在受影响的View结构上调用body
通常在SwiftUI中,我们只有一个ObservableObject,用于保存@Published属性中的模型结构。通常有2个单例,一个shared从磁盘加载,另一个preview预加载了用于驱动SwiftUI预览的测试数据。此对象使用.environmentObject在View结构之间共享
如果您尝试使用多个ObservableObject而不是@State来处理视图数据,您将遇到主要问题,实际上是SwiftUI使用值类型旨在消除的那种一致性问题。

相关问题