如何在异步调用后将新视图推送到 NavigationStack 上



我正在尝试学习SwiftUI的基础知识(来自UIKit(。

我只是想在async通话结束后推送一个新视图,但我找不到方法。

这是我的测试实现:

struct MasterView: View {
@State var parralaxOffset: CGFloat = 0
func handleParralax(_ reader: GeometryProxy) -> some View {
self.parralaxOffset = reader.frame(in: .global).minY
return Text("Foreground contentOffset: (reader.frame(in: .global).minY)")
}
var body: some View {
NavigationView {
Group {
Button(action: {
self.dummyAsynCall() {
//Push a new view
}
}) {
Text("Button")
}
}
}.navigationBarTitle("test")
}
private func dummyAsynCall(_ onComplete: @escaping (() -> ())) {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
print("Call completed")
onComplete()
}
}
}

我知道NavigationLink但它们是同步工作的(当用户基本上点击它时(。

有谁知道如何在完成块中执行导航?

您需要使用NavigationLink(destination: tag: selection:)并添加一个@Statevar,我将其称为已完成,然后您需要使用NavigationLink(destination: tag: selection:)其中 标签在本例中将是预期值true,在选择参数中,您需要在这种情况下传递@Statevar$finished

import SwiftUI
struct LandmarkList: View {
@State var finished : Bool? = nil
let landmark = landmarkData[0]
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: LandmarkDetails(currentLandmark:  self.landmark), tag: true, selection: self.$finished) {
Button(action: {
self.dummyAsynCall() {
self.finished = true
}
}) {
Text("Button")
}
}
}
}.navigationBarTitle("test")
}
private func dummyAsynCall(_ onComplete: @escaping (() -> ())) {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) {
print("Call completed")
onComplete()
}
}
}

你可以在这里找到更好的解释;)https://mecid.github.io/2019/07/17/navigation-in-swiftui/

最新更新