SwiftUI:从嵌套视图调用方法



我对SwiftUI很熟悉,为了让我的代码更可读,我通常会把我的视图分成更小的视图。

假设我有一个viewModel,从嵌套视图调用viewModel的方法的最佳方式是什么?现在,我将ViewModel作为每个嵌套视图的参数进行传递,但我觉得它不是非常优化和干净。。。

有没有办法通知MyMainView HeaderSubview的按钮被点击了?例如,我可以使用Combine吗?

ViewModel

class MyViewModel {
func fetchSomeData() {
print("Fetching Some Data")
}
}

主视图

struct MyMainView: View {
var myViewModel = MyViewModel()
var body: some View {
HeaderView(viewModel: myViewModel)
}
}
struct HeaderView: View {
var viewModel: MyViewModel
var body: some View {
HeaderSubview(viewModel: viewModel)
}
}
struct HeaderSubview: View {
var viewModel: MyViewModel
var body: some View {
Button("Search") {
// I want to call my View Model method here
viewModel.fetchSomeData()
}
}
}

您可以使类ObservableObject并将其作为环境对象注入,这样任何子视图都可以使用它,主视图也可以观察它。

类似的东西

class MyViewModel: ObservableObject {
@Published var loading = false
func fetchSomeData() {
loading = true

DispatchQueue.global(qos: .background).async {
print("Fetching Some Data")
// ... long activity here
DispatchQueue.main.async { [weak self] in
self?.loading = false
}
}

}
}
struct MyMainView: View {

@StateObject var myViewModel = MyViewModel()
var body: some View {
HeaderView().environmentObject(myViewModel)
if myViewModel.loading {
Text("Loading...")
}
}
}
struct HeaderView: View {

var body: some View {
HeaderSubview()
}
}
struct HeaderSubview: View {
@EnvironmentObject var viewModel: MyViewModel
var body: some View {
Button("Search") {
// I want to call my View Model method here
viewModel.fetchSomeData()
}
}
}

最新更新