swift macOS上可搜索修饰符的键命令

wydwbb8l  于 2024-01-05  发布在  Swift
关注(0)|答案(2)|浏览(173)

编辑

现在有一个solution用于iOS 17

原创帖子

iOS 15 SwiftUI 3.0中引入的新功能之一是.searchable视图修饰符。下面是它如何工作的一个简单示例。我想添加通过按下⌘F搜索的功能,因为大多数应用程序都有。我如何实现该功能?据我所知,.keyboardShortcut修改器只能用于Button视图,这是相当有限的。有没有办法或变通办法?谢谢!:)

  1. struct ContentView: View {
  2. @State var searchText = ""
  3. private let fruits = ["apple", "banana", "plum", "grape"]
  4. var filteredFruits: [String] {
  5. if !searchText.isEmpty {
  6. return fruits.filter { $0.starts(with: searchText.lowercased()) }
  7. } else {
  8. return fruits
  9. }
  10. }
  11. var body: some View {
  12. NavigationView {
  13. List {
  14. ForEach(filteredFruits, id: \.self) { fruit in
  15. Text(fruit.capitalized)
  16. }
  17. }
  18. .navigationBarTitle("Search")
  19. .searchable(text: $searchText) // Need to add key command to search (⌘F)
  20. }
  21. }
  22. }

字符串

pengsaosao

pengsaosao1#

您可以使用SwiftUI-Introspect来获取底层的UISearchBar,然后创建一个由键盘快捷键触发的隐藏按钮来聚焦搜索栏。
下面的示例允许您执行BIFF以激活搜索栏。
范例:

  1. struct ContentView: View {
  2. @State private var searchText = ""
  3. @State private var searchBar: UISearchBar?
  4. private let fruits = ["apple", "banana", "plum", "grape"]
  5. var filteredFruits: [String] {
  6. if !searchText.isEmpty {
  7. return fruits.filter { $0.starts(with: searchText.lowercased()) }
  8. } else {
  9. return fruits
  10. }
  11. }
  12. var body: some View {
  13. NavigationView {
  14. List {
  15. ForEach(filteredFruits, id: \.self) { fruit in
  16. Text(fruit.capitalized)
  17. }
  18. }
  19. .navigationBarTitle("Search")
  20. .searchable(text: $searchText)
  21. .background(
  22. Button("Search fruits") {
  23. focusSearchBar()
  24. }
  25. .keyboardShortcut("F", modifiers: .command)
  26. .hidden()
  27. )
  28. }
  29. .introspectNavigationController { nav in
  30. searchBar = nav.navigationBar.subviews.first { view in
  31. view is UISearchBar
  32. } as? UISearchBar
  33. }
  34. }
  35. private func focusSearchBar() {
  36. searchBar?.becomeFirstResponder()
  37. }
  38. }

字符串
测试结果:


的数据

展开查看全部
oipij1gg

oipij1gg2#

两年后,我在这里,我们得到了苹果的回应。
从iOS 17开始,您现在可以使用.searchable(text: Binding<String>, isPresented: Binding<Bool>)

  1. struct ContentView: View {
  2. @State private var searchText = ""
  3. @State private var isSearching = false
  4. private let fruits = ["apple", "banana", "plum", "grape"]
  5. var filteredFruits: [String] {
  6. if !searchText.isEmpty {
  7. return fruits.filter { $0.starts(with: searchText.lowercased()) }
  8. } else {
  9. return fruits
  10. }
  11. }
  12. var body: some View {
  13. NavigationView {
  14. List {
  15. ForEach(filteredFruits, id: \.self) { fruit in
  16. Text(fruit.capitalized)
  17. }
  18. }
  19. .navigationBarTitle("Search")
  20. .searchable(text: $searchText, isPresented: $isSearching)
  21. .background(Button("", action: { isSearching = true }).keyboardShortcut("f").hidden()) // some means to trigger the key command
  22. }
  23. }
  24. }

字符串
希望对大家有帮助:)

展开查看全部

相关问题