ios - 从 ViewModel 弹出导航 View

标签 ios swift swiftui

我正在使用 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/

相关文章:

objective-c - 获取另一台计算机的 MAC 地址,给定其 IP 地址

swift - 为什么NSOperation触发此崩溃?

ios - 为什么在解除警报后重置@state

ios - IBOutletCollection 与 Xamarin 可能吗?

ios - 在 iPhone 上调试 MFI 应用程序

ios - Swift 匹配嵌套结构数组中的元素

ios - 同时使用滑动手势和触摸开始/移动/结束

ios - 如何根据 numberOfItemsInSection 的数量设置 heightForRowAt?

SwiftUI 预览错误 - "Cannot preview in this file - Update failed"

swiftui - 使用 SwiftUI 的 relativeWidth 仅在框架 View 内有效