打开应用程序时如何选择 SwiftUI 导航 link

How do I have a SwiftUI navigation link selected when you open the app

我创建了一个示例项目来更好地解释这一点。

当您在 iPad 上打开设置应用时,屏幕右侧显示常规设置,左侧显示常规设置导航 link 选中

Image of settings app

但是当人们打开我的应用程序时,屏幕右侧是“你好”页面,但在左侧,你好导航link未被选中

Image of my app

我的代码:


import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            PrimaryView()
            HelloView()
        }
    }
}

struct PrimaryView: View {
    var body: some View {
        List {
            NavigationLink("Hello", destination: HelloView())
            NavigationLink("World", destination: WorldView())
        }
        .listStyle(InsetGroupedListStyle())
    }
}

struct HelloView: View {
    var body: some View {
        List {
            Text("Hello")
        }.navigationTitle("Hello")
    }
}

struct WorldView: View {
    var body: some View {
        List {
            Text("World")
        }.navigationTitle("World")
    }
}

我试图在 Google 上找到这个问题的答案,但我可能只是不知道正确的关键字

提前致谢:)

首先,您必须 select 以编程方式启动 navigationLink。 为此,您必须为 NavigationLink 选择另一个初始化程序。

public init <V> (destination: Destination, tag: V, selection: Binding <V?>, @ViewBuilder label: () -> Label) where V: Hashable

哪个给:

NavigationLink("Hello", destination: HelloView(), tag: 1, selection: $selectedLink)

其中 selectedLink 是 @State 或 @Binding。这里我们会选择一个@Binding :

@Binding var selectedLink: Int?

因为 selectedLink 也将在 NavigationView 的第一次显示时被更改/“初始化”。 这个 NavigationView 在视图层次结构中更高:

struct ContentView: View {
    @State private var selectedLink: Int?

    var body: some View {
        NavigationView {
            PrimaryView(selectedLink: $selectedLink)
            HelloView()
        }
        .onAppear {
            selectedLink = 1
        }
    }
}

struct PrimaryView: View {
    @Binding var selectedLink: Int?
    var body: some View {
        List {
            NavigationLink("Hello", destination: HelloView(), tag: 1, selection: $selectedLink)
                
            NavigationLink("World", destination: WorldView(), tag: 2, selection: $selectedLink)
        }
        
        .listStyle(InsetGroupedListStyle())
        
    }
}

现在我们必须在开始时强制突出显示 NavigationLink(只要它是 selected) 为此,我们可以使用 listRowBackground:

NavigationLink("Hello", destination: HelloView(), tag: 1, selection: $selectedLink)
                .listRowBackground(selectedLink == 1 ? Color(UIColor.systemGray4) : Color.clear)