如何以编程方式触发NavigationLink出现

时间:2020-03-22 08:53:47

标签: ios swiftui ios13 swiftui-navigationlink

我试图以编程方式在出现时触发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
    }
}

这是一个错误还是有实现预期效果的方法?

1 个答案:

答案 0 :(得分:0)

使用Xcode 11.4 / iOS 13.4,可以使用.toggle()正常运行,如下所示

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

demo