如何将 UISearchController 放置到 navigationTitle 以及如何通过按钮启用和禁用它?

DNA*_*DNA 1 search uisearchbar swift uisearchcontroller

我是 Swift 新手,想知道是否有可能将 UIsearchcontroller 放置在 navgationtitle 中,并通过位于 navigationRightItem 的按钮隐藏和取消隐藏 uisearchcontroller。我见过很多将 UISearchBar 从对象库放置到 navigationTitle 的示例,但没有 uisearchcontroller 的示例。有些人甚至说对象库中的 UISearch bar 已从 ios10 Swift 中弃用。请澄清弃用以及为什么我应该避免使用对象库中的 UISearchBar。哪一种是用于 firebase tableview 搜索的最佳实践。如果您能提供代码示例,我将很高兴。先感谢您。

小智 5

UI搜索栏

\n\n

UISearchBar 尚未被弃用。UISearchBar 是一个 UIView,您可以将其放置在您想要的任何位置,包括导航栏,但如果您想要的话,也可以将其放置在屏幕中间。您可以通过编程方式执行此操作,也可以使用 Interface Builder 拖动搜索栏并将其放置在您的视图之一内。

\n\n

使用 UISearchBar

\n\n

实现搜索的一种方法是使用 UISearchBar,将其放入 navigationItem.titleView 中,并将视图控制器设置为该搜索栏的委托。当用户与搜索栏交互时,您的视图控制器会收到通知,并且您必须在同一视图控制器中处理搜索逻辑。例如,您可能需要检测搜索是否处于活动状态,以决定表视图使用什么数据源 - 如果搜索未处于活动状态,则显示所有项目;如果搜索处于活动状态,您将仅显示项目的子集。或者您可能希望为主视图显示一种布局,并为搜索结果显示另一种布局。同样,您必须在视图控制器中处理此逻辑。这就是 UISearchController 派上用场的地方!

\n\n

使用 UISearchController

\n\n

UISearchController 是一个为您提供 UISearchBar 的 UIViewController。UISearchController 很有用,因为它可以帮助您在新的视图控制器中呈现搜索结果,使搜索逻辑与主逻辑分开。\n要解决问题中的特定问题,请记住您在 navigationItem 中放入的内容。 titleView 是 UISearchBar,而不是 UISearchController。您可以自己创建此 UISearchBar,也可以创建 UISearchController 并使用其搜索栏 (searchController.searchBar)。

\n\n

将 UISearchBar 放置在 navigationItem.titleView VS 使用 navigationItem.searchController 属性

\n\n

将 UISearchBar 放置在 navigationItem.titleView 中是多个应用程序中使用的常见模式。然而,在 iOS 11 中,Apple 引入了 navigationItem.searchController 属性。这里没有什么被弃用的,但是当谈到在导航栏中使用搜索栏时,苹果似乎更希望我们这样做。

\n\n

以下是其工作原理的示例。

\n\n

使用 navigationItem.searchController 属性和 UISearchController 来管理搜索结果的显示

\n\n

您的主视图控制器:\n

\n\n
class HomeViewController: UIViewController {\n   (\xe2\x80\xa6)\n\n    override func viewDidLoad() {\n        (\xe2\x80\xa6)\n\n        // Get the view controller that will be used to present search results.\n        let storyboard = UIStoryboard(name: "Main", bundle: nil)\n        guard let languagesSearchResultsViewController = storyboard.instantiateViewController(withIdentifier: "LanguagesSearchResultsViewController") as? LanguagesSearchResultsViewController else { return }\n\n        // Create a search controller and initialize it with the view controller that will be used to show the search results\n        let searchController = UISearchController(searchResultsController: languagesSearchResultsViewController)\n\n        // The searchResultsUpdater is the object that will be notified when the user performs a search.\n        // I\'m setting it to be the view controller that will present the results but is doesn\'t have to be.\n        searchController.searchResultsUpdater = languagesSearchResultsViewController\n\n        // Set the searchController property in the navigationItem and a search bar will automagically appear in the navigation bar, below the title.\n        navigationItem.searchController = searchController\n        definesPresentationContext = true\n\n        (\xe2\x80\xa6)        \n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

您\xe2\x80\x99 将用来呈现搜索结果的视图控制器:

\n\n
class LanguagesSearchResultsViewController: UIViewController {\n\n    // MARK: - Properties\n\n    // Complete list of items to search. If you\'re doing a network request for your search term then you don\'t need this.\n    let languages = ["Mandarin Chinese", "English", "Hindustani", "Spanish", "Arabic", "Malay", "Russian", "Bengali", "Portuguese", "French", "Hausa", "Punjabi", "German", "Japanese", "Persian", "Swahili", "Telugu", "Javanese", "Wu Chinese", "Korean"]\n\n    // The data source for your search results\n    var searchResults: [String] = []\n\n    // MARK: - IBOutlets\n\n    @IBOutlet weak var tableView: UITableView!\n\n    // MARK: - UIViewController methods\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        tableView.dataSource = self\n    }\n\n   (\xe2\x80\xa6)\n}\n\n// MARK: - UISearchResultsUpdating\n\nextension LanguagesSearchResultsViewController: UISearchResultsUpdating {\n    func updateSearchResults(for searchController: UISearchController) {\n        guard let searchText = searchController.searchBar.text else { return }\n        searchResults = languages.filter { $0.contains(searchText) }\n        tableView.reloadData()\n    }\n}\n\n// MARK: - UITableViewDataSource\n\nextension LanguagesSearchResultsViewController: UITableViewDataSource {\n    func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return searchResults.count\n    }\n\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        guard let cell = tableView.dequeueReusableCell(withIdentifier: "LanguageTableViewCell") as? LanguageTableViewCell else { return UITableViewCell() }\n\n        let language = searchResults[indexPath.row]\n\n        cell.languageNameLabel.text = language\n        return cell\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您仍然希望 titleView 中的搜索栏具有您所描述的显示/隐藏行为,那么您将需要一些更自定义的内容,无论是否使用 UISearchController。其他问题已经有很多答案可以帮助您做到这一点。希望这将有助于澄清您的选择。

\n