Как добавить новый вид на NavigationStack после асинхронного вызова - PullRequest
2 голосов
/ 11 октября 2019

Я пытаюсь изучить основы SwiftUI (из UIKit).

Я просто пытаюсь открыть новый просмотр, как только мой вызов async завершен, но я не нахожуhow.

Это моя тестовая реализация:

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, но они работают синхронно (когда пользователь касается ее в основном).

Кто-нибудьзнаете, как выполнить навигацию в блоке завершения?

1 Ответ

1 голос
/ 11 октября 2019

Вам нужно использовать NavigationLink(destination: tag: selection:) и добавить @State var, я назвал это законченным, тогда вам нужно использовать NavigationLink(destination: tag: selection:), где tag будет ожидаемым значением в этом случае 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...