Я пытаюсь вызвать 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
}
}
Это ошибка или есть способ добиться желаемого эффекта?