问题描述
我有一个SwiftUI应用,该应用包含两列和一个工具栏。我正在尝试模拟最新的macOS应用程序,并以与Mail相同的方式使用工具栏,即选择一个侧边栏项目并将其显示为窗口标题。
这是我的代码:
import SwiftUI
var listItems = ["Item 1","Item 2","Item 3","Item 4"]
var secondItems = ["Second 1","Second 2","Second 3","Second 4"]
struct ContentView: View
{
@State var select: String? = "Item 1"
var body: some View
{
vstack
{
NavigationView
{
List
{
ForEach((0..<listItems.count),id: \.self)
{index in
NavigationLink(destination: SecondView(),tag: listItems[index],selection: $select)
{
Text(listItems[index])
.padding(.vertical,2.0)
}
}
Spacer()
}.frame(width:160)
}
.toolbar
{
Text("this is not the title")
Button(action: {})
{
Label("Upload",systemImage: "square.and.arrow.up")
}
}
}
}
}
struct SecondView: View
{
var body: some View
{
NavigationView
{
List
{
ForEach((0..<secondItems.count),id: \.self)
{index in
NavigationLink(destination: Text(secondItems[index]))
{
Text(secondItems[index])
.frame(height: 20)
}
}
}.frame(width:150)
}
}
}
所以我得到了这样的工具栏:
但是当我在第一个列表中选择一个项目时如何在工具栏中设置窗口的标题?
解决方法
Here is how I solved it:
import SwiftUI
var listItems = ["Item 1","Item 2","Item 3","Item 4"]
var secondItems = ["Second 1","Second 2","Second 3","Second 4"]
struct ContentView: View
{
@State var select: String? = "Item 1"
var body: some View
{
VStack
{
NavigationView
{
List
{
ForEach((0..<listItems.count),id: \.self)
{index in
NavigationLink(destination: SecondView(),tag: listItems[index],selection: $select)
{
Text(listItems[index])
.frame(height: 20)
}
}
Spacer()
}
.listStyle(SidebarListStyle())
}
.toolbar
{
Text("this is not the title")
Button(action: {})
{
Label("Upload",systemImage: "square.and.arrow.up")
}
}
.navigationTitle(select!)
.navigationSubtitle("\(listItems.count) records")
.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
}
struct SecondView: View {
var body: some View {
NavigationView {
List
{
ForEach((0..<secondItems.count),id: \.self)
{index in
NavigationLink(destination: Text(secondItems[index]))
{
Text(secondItems[index])
.frame(height: 20)
}
}
}
}
}
}