从 ViewModel 弹出导航视图
Posted
技术标签:
【中文标题】从 ViewModel 弹出导航视图【英文标题】:Pop Navigation view from ViewModel 【发布时间】:2019-12-02 08:36:28 【问题描述】:我正在使用 swiftUI 并结合,我的虚拟机中有一些业务逻辑。有些结果必须在导航视图堆栈中弹出我的视图。
我在某些视图中使用这个来模拟后退按钮事件:
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
self.presentationMode.wrappedValue.dismiss()
我在视图模型中尝试过,但它不起作用。有什么想法吗?
【问题讨论】:
在你展示不起作用的代码之前没有想法)) 显示的代码在视图模型中不起作用。 此代码需要在您的视图中。您的视图模型没有presentationMode
同意这一点,这就是为什么我希望在我的虚拟机中做类似的事情。
【参考方案1】:
这是我之前回答的follow up question。
您可以通过实现您的自定义Publisher
来实现这一点,它将使用.send()
方法允许您向订阅者发送特定值(在本例中为您的View
)。您将使用 SwiftUI 的 View
协议上定义的 onReceive(_:perform:)
方法订阅您定义的自定义 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()
【讨论】:
我还更新了旧问题的answer。 谢谢。我需要花更多时间在组合框架上。以上是关于从 ViewModel 弹出导航视图的主要内容,如果未能解决你的问题,请参考以下文章