ios - SwiftUI:从嵌套 View 调用方法

标签 ios mvvm swiftui combine

我对 SwiftUI 非常熟悉,为了使我的代码更具可读性,我通常将 View 分解为更小的 View 。

假设我有一个 viewModel,从嵌套 View 调用 viewModel 方法的最佳方法是什么?现在,我将 ViewModel 作为每个嵌套 View 的参数传递,但我发现它不是非常优化和干净......

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

View 模型

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 并将其注入(inject)为环境对象,因此任何 subview 都可以使用它,并且主视图将能够观察它。

类似的东西

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()
        }
    }
}

关于ios - SwiftUI:从嵌套 View 调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65148657/

相关文章:

ios - 使用 iOS 应用程序开发 Realm ,有没有办法以 GUI 的形式查看数据库?

android - 除了启动我的应用程序之外,我能否使用 NFC 标签执行更多操作?

ios - 如何在 Swift 中使用 GRDB 创建多对多关联?

wpf - ViewModel - 我的业务逻辑层?

WPF DataGrid ContextMenu 命令绑定(bind)到 MVVMLight RelayCommand<T> 并不总是有效

SwiftUI:在执行下面的代码之前等待 Alamofire 请求完成

ios - MKMapKit 禁止取消选择标注气泡

wpf - 单个值的 INotifyPropertyChanged 与 ObservableCollection

ios - 向后滑动失败时,SwiftUI 导航栏项目变得困惑

swift - SwiftUI 中的两个 ForEach