如何在SwiftUI中从viewModel中取消视图?

3

我有一个采用MVVM架构的视图,在视图中,当点击按钮时,我会从viewModel类调用webService,在成功后我想关闭视图。

我的viewModel是ObservableObject

我使用导航而不是工作表(sheet)来移动到其他屏幕

我尝试过这个方法

@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
`self.presentationMode.wrappedValue.dismiss()`

视图会在API调用之前被调用。

在viewModel接收到API数据后,有没有什么方法来解除视图?

谢谢你的帮助。


你有一个名为ObservableObject的模型类型吗? - Simone Pistecchia
@SimonePistecchia 是的 - New iOS Dev
你尝试使用onReceive了吗?请添加最小可重现代码。 - Simone Pistecchia
2个回答

3

我没有编译我的代码,但我认为这种方法应该可以工作。我在我的个人项目中使用了类似的方法。

import SwiftUI
import Combine

class ViewModel: ObservableObject {
    
    var didSendRequest: AnyPublisher<Void, Never> {
        subject.eraseToAnyPublisher()
    }
    
    private let subject = PassthroughSubject<Void, Never>()
}

struct ContentView: View {
    
    var viewModel: ViewModel
    
    @Environment(\.presentationMode)
    var presentationMode
    
    var body: some View {
        VStack {
            Text("Hello")
        }
        .onReceive(viewModel.didSendRequest) { _ in
            presentationMode.wrappedValue.dismiss()
        }
    }
}

在你的视图模型中,当你收到响应时,你应该执行下一行代码:

subject.send()

1
在您的ObservableObject中,设置一个@Published变量,指示API加载完成。
class APIController: ObservableObject {
    @Published var apiLoaded = false;
    
    func doTheApiLoad() {
        ...
        //when you want to dismiss
        DispatchQueue.main.async {
            self.apiLoaded = true;
        }
    }

}

在您的内容视图中,注意已发布的值。
@ObservedObject var apiController: APIController()

当它改变时,关闭视图。
if (apiController.apiLoaded == true) {
    presentationMode.wrappedValue.dismiss()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接