我正在使用 swiftUI 并结合,我的 VM 中有一些业务逻辑。某些结果必须在导航视图堆栈中弹出我的视图。
我在某些视图中使用了这个来模拟后退按钮事件:
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
self.presentationMode.wrappedValue.dismiss()
Run Code Online (Sandbox Code Playgroud)
我在视图模型中尝试过,但它不起作用。有任何想法吗 ?
这是我之前回答的后续问题。
您可以通过实现您的自定义来实现这一点,该自定义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)
| 归档时间: |
|
| 查看次数: |
329 次 |
| 最近记录: |