打开应用程序时如何选择 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)
我创建了一个示例项目来更好地解释这一点。
当您在 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)