我试图以编程方式在出现时触发NavigationLink,但在所有情况下,目标视图在出现(iOS 13.3.1, Xcode 11.3.1)
之后都会立即弹出。
设置如下:ContentView具有到DetailView1的NavigationLink,而后者又具有到DetailView2的NavigationLink。我希望在DetailView1首次加载时自动触发DetailView1中的NavigationLink(在我的实际代码中,这将基于条件,但这与此处无关)。
这是基本代码(没有自动行为):
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)
}
}
我的第一种方法是在DetailView1中将isActive
设置为true:
@State private var isActive = true
如预期的那样,会触发NavigationLink,但是DetailView2出现后会立即弹出。
我也(或者)尝试在isActive
内将.onAppear
设置为true
.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
}
}
这是一个错误还是有实现预期效果的方法?
答案 0 :(得分:0)
使用Xcode 11.4 / iOS 13.4,可以使用.toggle()
正常运行,如下所示
.navigationBarTitle(Text("Detail View 1"), displayMode: .inline)
.onAppear {
self.isActive.toggle()
}