Как программно вызвать NavigationLink при появлении - PullRequest
1 голос
/ 22 марта 2020

Я пытаюсь вызвать NavigationLink программным способом при появлении, но во всех случаях представление назначения появляется сразу после появления (iOS 13.3.1, Xcode 11.3.1).

Настройка выглядит следующим образом: ContentView имеет NavigationLink для DetailView1, который, в свою очередь, имеет навигационная ссылка на DetailView2. Я хотел бы, чтобы NavigationLink в DetailView1 запускался автоматически при первой загрузке DetailView1 (в моем фактическом коде это будет основано на условии, но здесь это не имеет значения).

Это основа c код (без автоматического поведения c):

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            NavigationLink(destination: DetailView1()) {
                Text("Open Detail View 1")
            }
                .navigationBarTitle(Text("ContentView"))
        }
    }
}


struct DetailView1: View {
@State private var isActive = false

    var body: some View {
        VStack {
            NavigationLink(destination: DetailView2(), isActive: $isActive) {
                EmptyView()
            }
            Button ("Open Detail View 2") {
                self.isActive = true
            }
        }
        .navigationBarTitle(Text("Detail View 1"), displayMode: .inline)
    }
}


struct DetailView2: View {
    var body: some View {
        Text("This is Detail View 2")
            .navigationBarTitle(Text("Detail View 2"), displayMode: .inline)
    } 
}

Мой первый подход состоял в том, чтобы установить isActive в значение true при объявлении в DetailView1:

@State private var isActive = true

Как и ожидалось , NavigationLink срабатывает, но DetailView2 появляется сразу после появления.

Я также (альтернативно) пытался установить для isActive значение true в пределах .onAppear

.navigationBarTitle(Text("Detail View 1"), displayMode: .inline)
.onAppear(){
    self.isActive = true
}

Результат однако то же самое.

На самом деле работала задержка установки isActive на true, по крайней мере, на 0,75 секунды, что, по моему мнению, не является приемлемым решением.

.navigationBarTitle(Text("Detail View 1"), displayMode: .inline)
.onAppear(){
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.75) {
        self.isActive = true
    }
}

Это ошибка или есть способ добиться желаемого эффекта?

1 Ответ

0 голосов
/ 22 марта 2020

С Xcode 11.4 / iOS 13.4 работает правильно, используя .toggle(), как показано ниже

.navigationBarTitle(Text("Detail View 1"), displayMode: .inline)
.onAppear {
    self.isActive.toggle()
}

demo

...