SwiftUI searchbar



我试图建立一个应用程序,可以通过表显示不同的pdf。到目前为止,一切都很好,但我希望用户能够通过搜索栏过滤触发表修改器的按钮。这对我不起作用。我尝试了web和Stack Overflow的不同解决方案,但它们都不适合我。我想我必须从触发布尔值的按钮中过滤文本。但如何?与列表或ForEach我不能按钮与每次不同的var/Bool。

下面是我的搜索栏类,只有一个列表和过滤,它工作。

class SearchBar: NSObject, ObservableObject {


let searchController: UISearchController = UISearchController(searchResultsController: nil)

@Binding var text: String
let hide : Bool
let placeholder : String
let cancelButton : Bool
let autocapitalization : UITextAutocapitalizationType

init(text: Binding<String>, hide: Bool, placeholder: String, cancelButton: Bool, autocapitalization: UITextAutocapitalizationType) {

self._text = text
self.hide = hide
self.placeholder = placeholder
self.cancelButton = cancelButton
self.autocapitalization = autocapitalization

super.init()


self.searchController.obscuresBackgroundDuringPresentation = false
self.searchController.searchResultsUpdater = self

self.searchController.hidesNavigationBarDuringPresentation = hide
self.searchController.automaticallyShowsCancelButton = cancelButton
self.searchController.searchBar.placeholder = placeholder
self.searchController.searchBar.autocapitalizationType = autocapitalization

}
}
extension SearchBar: UISearchResultsUpdating {

func updateSearchResults(for searchController: UISearchController) {

// Publish search bar text changes.
if let searchBarText = searchController.searchBar.text {
self.text = searchBarText
}
}
}
struct SearchBarModifier: ViewModifier {

let searchBar: SearchBar

func body(content: Content) -> some View {
content
.overlay(
ViewControllerResolver { viewController in
viewController.navigationItem.searchController = self.searchBar.searchController
}
.frame(width: 0, height: 0)
)
}
}
extension View {

func add(_ searchBar: SearchBar) -> some View {
return self.modifier(SearchBarModifier(searchBar: searchBar))
}

}

我的建议是用一个调用闭包并传递输入文本的动作来替换Binding。

替换@Binding var text: String
var action : ((String) -> Void)?

updateSearchResults替换为

func updateSearchResults(for searchController: UISearchController) {
if let searchBarText = searchController.searchBar.text {
DispatchQueue.main.async {  self.action?(searchBarText) }
}
}

和ViewModifier以及带有

的视图扩展
struct SearchBarModifier: ViewModifier {

let searchBar: SearchBar
let action : ((String) -> Void)?

func body(content: Content) -> some View {
content
.overlay(
ViewControllerResolver { viewController in
searchBar.action = action
viewController.navigationItem.searchController = self.searchBar.searchController
}
.frame(width: 0, height: 0)
)
}
}
extension View {
func add(_ searchBar: SearchBar, action : ((String) -> Void)?) -> some View {
return self.modifier(SearchBarModifier(searchBar: searchBar, action: action))
}
}

在视图中你可以添加搜索栏

.add(self.searchBar, action: { query in
// do something with query
})

当用户按下一个键时,闭包正在被调用。

如果你想在用户按Search/Go键时调用闭包一次,你必须实现searchBarSearchButtonClicked并添加另一个动作。