我正在使用swiftUI进行合并,我的VM中具有一些业务逻辑。有些结果必须在导航视图堆栈中弹出我的视图。
在某些视图中,我使用了这个来模拟后退按钮事件:
{"error_type": "OAuthException", "code": 400, "error_message": "You must provide a client_id"}
我在视图模型中尝试过,但是它不起作用。有什么想法吗?
答案 0 :(得分:1)
这是我之前回答的follow up question。
您可以通过实现自定义Publisher
来实现此目的,该自定义.send()
将使用View
方法来允许您将特定值发送给订户(在这种情况下为onReceive(_:perform:)
)。您将使用在 SwiftUI 的View
协议上定义的Publisher
方法来订阅您定义的自定义perform
的输出流。在View
动作闭包内,您将可以访问{{1}。
有足够的理论,您可以看一下下面的代码,应该不会很难理解:
import Foundation
import Combine
class ViewModel: ObservableObject {
var viewDismissalModePublisher = PassthroughSubject<Bool, Never>()
private var shouldPopView = false {
didSet {
viewDismissalModePublisher.send(shouldPopView)
}
}
func performBusinessLogic() {
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
self.shouldPopView = true
}
}
}
视图为:
import SwiftUI
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
Text("Hello, World!")
NavigationLink(destination: DetailView()) {
Text("Detail")
}
}
.navigationBarTitle(Text("Home"))
}
}
}
struct DetailView: View {
@ObservedObject var viewModel = ViewModel()
@Environment(\.presentationMode) private var presentationMode
var body: some View {
Text("Detail")
.navigationBarTitle("Detail", displayMode: .inline)
.onAppear {
self.viewModel.performBusinessLogic()
}
.onReceive(viewModel.viewDismissalModePublisher) { shouldPop in
if shouldPop {
self.presentationMode.wrappedValue.dismiss()
}
}
}
}