【问题标题】:How can I use an observableobject class in an observableobject on SwiftUI?如何在 SwiftUI 上的可观察对象中使用可观察对象类?
【发布时间】:2023-01-10 20:22:37
【问题描述】:

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

据我所知,“视图”只是视图。它不是控制器。 所以我像方式 1 一样发展。 但是我遇到了一个问题,我如何在另一个可观察对象中使用可观察对象?

我想如果我用 observableobject 传递一个参数,问题就会迎刃而解。 但我认为这是不好的方式..

所以我想到了方式2。 但方式是“视图”不仅仅是视图。它是视图和控制器。

所以我很困惑 way2 是不是坏方法。

哪种方式好?我想知道其他 SwiftUI 开发人员如何开发这种情况。

如果您认为有比 way1 和 way2 更好的方法,请告诉我。

概括

Q1。方式 1 - 如何在另一个可观察对象中使用可观察对象? (单例?喜欢静态共享)

Q2。 Way2 - 这是正确的方法吗? (视图=视图+控制器)

Q3.你的建议。

环境

Xcode 14.2

斯威夫特 5.7.2

【问题讨论】:

  • 作为一个快速的 UI 开发人员,我更喜欢在一个视图中有 2 个 Observable 对象,并且在接收时将另一个对象中的变量更改为它不会与您的结构发生冲突,并且您的视图将只是视图,并且代码会更清晰
  • @NoorAhmedNatali 感谢您的回答。你能给我一些代码吗?你的意思是绑定参数变量?

标签: ios swift swiftui


【解决方案1】:

这是您的问题的示例代码

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
}

可观察对象主要用于有嵌套视图的地方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多