我正在使用 swiftUI 和组合,我的 VM 中有一些业务逻辑。有些结果必须在导航 View 堆栈中弹出我的 View 。
我在一些 View 中使用了这个来模拟后退按钮事件:
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
self.presentationMode.wrappedValue.dismiss()
我在 View 模型中尝试过,但它不起作用。有什么想法吗?
最佳答案
这是一个 follow up question我之前回答过。
您可以通过实现自定义 Publisher
来实现此目的这将使用 .send()
允许您向订阅者发送特定值的方法(在本例中为您的 View
)。您将使用onReceive(_:perform:)
View
上定义的方法SwiftUI 订阅自定义输出流的协议(protocol) Publisher
你定义的。 perform
里面操作关闭,您将可以访问发布者的最新发出值,您将实际解雇 View
.
理论已经足够了,你可以看看代码,应该不会很难理解,如下:
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()
}
}
}
}
关于ios - 从 ViewModel 弹出导航 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59135150/