SwiftUI:如何在macOS 11上使用NSSearchToolBarItem?

SwiftUI:如何在macOS 11上使用NSSearchToolBarItem?,swiftui,toolbar,macos-big-sur,nssearchtoolbaritem,Swiftui,Toolbar,Macos Big Sur,Nssearchtoolbaritem,我观看了WWDC的视频“采用macOS的新外观”,视频中11:32,他们在Swift中介绍了NSSearchToolBarItem 这正是我需要做的,但如何将此搜索添加到SwiftUI中的工具栏 有很多复杂的示例,但它们似乎都是在这个新API之前编写的。一定有更简单的方法吗 import SwiftUI var listItems = ["Item 1", "Item 2", "Item 3", "Item 4"]

我观看了WWDC的视频“采用macOS的新外观”,视频中11:32,他们在Swift中介绍了NSSearchToolBarItem

这正是我需要做的,但如何将此搜索添加到SwiftUI中的工具栏

有很多复杂的示例,但它们似乎都是在这个新API之前编写的。一定有更简单的方法吗

import SwiftUI

var listItems = ["Item 1", "Item 2", "Item 3", "Item 4"]

struct ContentView: View
{
    
    @State var select: String? = "Item 1"
    @State var searchText: String = "hello"

    var body: some View
    {
        VStack
        {
            NavigationView
            {
                List
                {
                    ForEach((0..<listItems.count), id: \.self)
                    {index in
                         Label(listItems[index], systemImage: "briefcase")
                    }
                }
            }
            
            .toolbar
            {
                Button(action: {})
                {
                    Label("Upload", systemImage: "square.and.pencil")
                }
                TextField("Search", text: $searchText)
            }
        }
    }
}
导入快捷界面
var listItems=[“项目1”、“项目2”、“项目3”、“项目4”]
结构ContentView:View
{
@状态变量选择:字符串?=“项目1”
@State var searchText:String=“hello”
var body:一些观点
{
VStack
{
导航视图
{
列表
{

ForEach((0..直接使用
NSSearchToolbarItem
似乎没有一个明显的方法来实现这一点,但是,查看该类,它在引擎盖下使用了一个
NSSearchField
,在SwiftUI中使用
NSViewRepresentable
相对容易:

struct SearchField:NSViewRepresentable{
类协调器:NSObject、NSSearchFieldDelegate{
var父项:SearchField
init(uu父项:SearchField){
self.parent=parent
}
func controlTextDidChange(uu通知:通知){
guard let searchField=notification.object as?NSSearchField else{
打印(“更新通知中的意外控件”)
返回
}
self.parent.search=searchField.stringValue
}
}
@绑定变量搜索:字符串
func makeNSView(上下文:context)->NSSearchField{
NSSearchField(帧:.0)
}
func updateNSView(searchField:NSSearchField,context:context){
searchField.stringValue=搜索
searchField.delegate=context.coordinator
}
func makeCoordinator()->Coordinator{
返回协调员(自我)
}
}
然后,您可以直接在
工具栏项中使用此托管视图:

工具栏项{
SearchField(搜索:$filter)
.frame(最小宽度:100,理想宽度:200,最大宽度:无穷大)
}
您可能希望稍微调整一下维度(在
.frame()
调用中)以匹配退出平台本机维度,但这似乎与Notes.app的外观非常匹配

在Notes.app中搜索工具栏项目:

从上面的示例代码中搜索工具栏项: