SwiftUI:如何在macOS 11上为工具栏设置标题?

问题描述

我有一个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)
        }
        
    }
}

所以我得到了这样的工具栏:

enter image description here

但是当我在第一个列表中选择一个项目时如何在工具栏中设置窗口的标题

解决方法

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)
                    }
                }
            }
        }
    }
}