导航栏中的 SwiftUI 搜索栏问题

问题描述

我按照文章http://blog.eppz.eu/swiftui-search-bar-in-the-navigation-bar/)中的例子实现了SearchBar,但是遇到了一个问题,附件中有更多细节,也许您有解决这个问题的想法?谢谢!

here's a video of the problem

我的代码

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 (将#修改为@)