swift - 基于 ViewModel 状态更新 SwiftUI View ?

标签 swift swiftui combine

我有一个使用 @State 的设置在我的 SwiftUI View 中,并在 View 中执行我的所有操作(加载 API 等),但是当尝试将其重组为使用 @ViewBuilder 时和 @State并使用 @ObservedObject ViewModel,我失去了根据 @State 动态更改 View 的能力变量

我的代码是

    
    @ObservedObject private var contentViewModel: ContentViewModel
    
    init(viewModel: ContentViewModel) {
        self.contentViewModel = viewModel
    }
    
    var body: some View {
        if contentViewModel.isLoading {
            loadingView
        }
        else if contentViewModel.fetchError != nil {
            errorView
        }
        else if contentViewModel.movies.isEmpty {
            emptyListView
        } else {
            moviesList
        }
    }

但是,只要这些 View 模型属性发生变化, View 就不会像我在类里面使用它们时那样更新 @State属性...

ViewModel如下:

final class ContentViewModel: ObservableObject {

    var movies: [Movie] = []
    var isLoading: Bool = false
    var fetchError: String?
    
    private let dataLoader: DataLoaderProtocol
    
    init(dataLoader: DataLoaderProtocol = DataLoader()) {
        self.dataLoader = dataLoader

        fetch()
    }

    func fetch() {
        isLoading = true
        dataLoader.loadMovies { [weak self] result, error in
            guard let self = `self` else { return }
            self.isLoading = false
            guard let result = result else {
                return print("api error fetching")
            }
            guard let error = result.errorMessage, error != "" else {
                return self.movies = result.items
            }
            return self.fetchError = error
        }
    }

现在我如何将这 3 个状态决定属性绑定(bind)到 View 结果,它们被抽象到 View 模型中?

谢谢

最佳答案

像这样在所有 3 个属性之前放置 @Published:

 @Published var movies: [Movie] = []
 @Published var isLoading: Bool = false
 @Published var fetchError: String?

通过使类符合 ObservableObject,您几乎就在那里,但它本身什么也不做。然后,您需要确保使用我上面显示的 @Published 自动发送更新,或者手动发送 objectWillChange.send()

编辑:

您还应该知道,如果将该数据传递给任何 child ,您应该将 parent 属性设置为 @StateObject,将 child 设置为 ObservedObject

关于swift - 基于 ViewModel 状态更新 SwiftUI View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66612944/

相关文章:

swift - 如何在 Swift 中的类之间正确发送值?

swift - Clipped Image 在框架外调用 TapAction

swiftui - SwiftUI 中 ScrollView 中 VStack 元素中的神秘间距或填充

SwiftUI:无法推断通用参数 'Subject'

ios - 如果 dataTaskPublisher 有非零数据,那么错误类型是什么?

ios - 快速组合 : How to specify the Error type of tryMap(_:)?

arrays - 从字符分组创建新数组?

ios - 如何设置iOS雷达图的坐标轴选项?

swift - 如何检索解析附加列数据

具有绑定(bind)变量的 SwiftUI 预览提供程序