问题描述
我按照文章(http://blog.eppz.eu/swiftui-search-bar-in-the-navigation-bar/)中的例子实现了SearchBar,但是遇到了一个问题,附件中有更多细节,也许您有解决这个问题的想法?谢谢!
我的代码:
SearchControllerProvider:
class SearchControllerProvider: NSObject,ObservableObject,UISearchResultsUpdating {
@Published var searchText: String = String()
let searchController: UISearchController
override init() {
self.searchController = UISearchController(searchResultsController: nil)
super.init()
self.searchController.obscuresBackgroundDuringPresentation = false
self.searchController.searchResultsUpdater = self
}
func updateSearchResults(for searchController: UISearchController) {
self.searchText = searchController.searchBar.text ?? String()
}
}
SearchControllerProviderModifier:
struct SearchControllerProviderModifier: ViewModifier {
let searchControllerProvider: SearchControllerProvider
func body(content: Content) -> some View {
content
.overlay(
ViewControllerResolver { viewController in
viewController.navigationItem.searchController = self.searchControllerProvider.searchController
}
.frame(width: 0,height: 0)
)
}
}
extension View {
func addSearchControllerToNavigationBar(from searchControllerProvider: SearchControllerProvider) -> some View {
return self.modifier(SearchControllerProviderModifier(searchControllerProvider: searchControllerProvider))
}
}
ViewControllerResolver:
final class ViewControllerResolver: UIViewControllerRepresentable {
let onResolve: (UIViewController) -> Void
init(onResolve: @escaping (UIViewController) -> Void) {
self.onResolve = onResolve
}
func makeUIViewController(context: Context) -> ParentResolverViewController {
ParentResolverViewController(onResolve: onResolve)
}
func updateUIViewController(_ uiViewController: ParentResolverViewController,context: Context) { }
}
ParentResolverViewController:
class ParentResolverViewController: UIViewController {
let onResolve: (UIViewController) -> Void
init(onResolve: @escaping (UIViewController) -> Void) {
self.onResolve = onResolve
super.init(nibName: nil,bundle: nil)
}
@available(*,unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func didMove(toParent parent: UIViewController?) {
super.didMove(toParent: parent)
if let parent = parent {
onResolve(parent)
}
}
}
我相应地使用:
struct MyView: View {
@Observedobject var searchProvider: SearchControllerProvider = SearchControllerProvider()
NavigationView {
List {
...
}
.navigationBarTitle(Text("Header"))
.navigationBarItems(leading: leadingView,trailing: trailingView)
.addSearchControllerToNavigationBar(from: searchProvider)
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)