从 ViewModel 弹出导航视图

the*_*ouk 2 ios swift swiftui

我正在使用 swiftUI 并结合,我的 VM 中有一些业务逻辑。某些结果必须在导航视图堆栈中弹出我的视图。

我在某些视图中使用了这个来模拟后退按钮事件:

@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

self.presentationMode.wrappedValue.dismiss()
Run Code Online (Sandbox Code Playgroud)

我在视图模型中尝试过,但它不起作用。有任何想法吗 ?

nay*_*yem 6

这是我之前回答的后续问题

您可以通过实现您的自定义来实现这一点,该自定义Publisher将使用.send()允许您将特定值发送给订阅者(在本例中为您的View)的方法。您将使用SwiftUI协议上onReceive(_:perform:)定义的方法来订阅您定义的自定义的输出流。在操作闭包中,您可以访问发布者的最新发布值,您将实际关闭.ViewPublisherperformView

理论讲够了,大家可以看代码,应该不难理解,如下:

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

意见是:

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()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)