从 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)。您将使用 SwiftUIView 协议上定义的 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 弹出导航视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航控制器一次弹出两个视图?

iOS 简单视图从导航堆栈错误弹出

以编程方式从嵌入导航控制器的视图中解除弹出窗口

如何从导航堆栈中的任何位置弹出到任意视图控制器

如何将视图与viewmodel关联或ViewModel的多个DataTemplates?

Android ViewModel 未从 BackStackEntry 获取选定项