首页 > 解决方案 > 异步调用后如何将新视图推送到 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但它们是同步工作的(当用户基本上点击它时)。

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

标签: iosswiftswiftui

解决方案


您需要使用NavigationLink(destination: tag: selection:)并添加一个@Statevar,我已将其称为已完成,然后您需要使用NavigationLink(destination: tag: selection:)where 标记将是这种情况下的预期值true,并且在选择参数中您需要@State在这种情况下传递 var$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/


推荐阅读