在iOS和iPadOS 15上使用SwiftUI,我们可以使用“searchable”修饰符添加搜索栏以过滤列表:
尝试使用它会在
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@State private var searchTerm = ""
@State private var selection = Set<Video.ID>()
private var fetchRequest: FetchRequest<Video>
private var searchResults: [Video] {
if searchTerm.isEmpty {
return fetchRequest.wrappedValue.filter { _ in true }
} else {
return fetchRequest.wrappedValue.filter { $0.matching(searchTerm) }
}
}
var body: some View {
NavigationView {
List {
ForEach(searchResults) { item in
VideoListCellView(video: item)
}
}.searchable(text: $searchTerm, prompt: "Video name") // <-- HERE
}
}
}
然而,在 macOS 上,新的 Table
容器不支持 searchable
修饰符:
struct ContentView: View {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [SortDescriptor(\.addDate, order: .reverse)], animation: .default)
private var videos: FetchedResults<Video>
@State
private var selection = Set<Video.ID>()
var body: some View {
NavigationView {
Table(videos, selection: $selection, sortOrder: $videos.sortDescriptors) {
TableColumn("Title") {
Text($0.title)
}
TableColumn("Added") {
Text($0.addDate)
}.width(120)
TableColumn("Published") {
Text($0.publishedAt)
}.width(120)
TableColumn("Duration") {
Text($0.duration)
}.width(50)
}.searchable(text: $searchTerm, prompt: "Video name") // <-- GENERATES ERROR
}
}
}
尝试使用它会在
var body: some View
中产生编译错误:The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions
有没有其他方法可以在 macOS 上搜索 Table
,或者这个功能还没有被支持?
searchable
修饰符应用于NavigationView而不是表格吗?这可能会被SwiftUI的编译器视为更简单,应该在相同位置(窗口工具栏的尾随边缘)显示搜索栏。 - ScottM