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

Swift 如何将UISearchController放置到navigationTitle,以及如何通过按钮启用和禁用它?,swift,search,uisearchbar,uisearchcontroller,Swift,Search,Uisearchbar,Uisearchcontroller,我是Swift新手,不知道是否有可能将UIsearchcontroller放置在navgationtitle中,并通过位于navigationRightItem的按钮隐藏和取消隐藏UIsearchcontroller。 我见过许多将UISearchBar从对象库放置到navigationTitle的示例,但没有uisearchcontroller的示例。有些人甚至说,ios10 Swift已经不推荐使用对象库中的UISearch栏。 请澄清反对意见,以及为什么我不应该从对象库中使用UISearc

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

UISearchBar

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

使用UISearchBar

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

使用UISearchController

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

在navigationItem.titleView中放置UISearchBar与使用navigationItem.searchController属性相比

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

下面是一个如何工作的示例

主视图控制器:

用于显示搜索结果的视图控制器:

class LanguagesSearchResultsViewController: UIViewController {

    // MARK: - Properties

    // Complete list of items to search. If you're doing a network request for your search term then you don't need this.
    let languages = ["Mandarin Chinese", "English", "Hindustani", "Spanish", "Arabic", "Malay", "Russian", "Bengali", "Portuguese", "French", "Hausa", "Punjabi", "German", "Japanese", "Persian", "Swahili", "Telugu", "Javanese", "Wu Chinese", "Korean"]

    // The data source for your search results
    var searchResults: [String] = []

    // MARK: - IBOutlets

    @IBOutlet weak var tableView: UITableView!

    // MARK: - UIViewController methods

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
    }

   (…)
}

// MARK: - UISearchResultsUpdating

extension LanguagesSearchResultsViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        guard let searchText = searchController.searchBar.text else { return }
        searchResults = languages.filter { $0.contains(searchText) }
        tableView.reloadData()
    }
}

// MARK: - UITableViewDataSource

extension LanguagesSearchResultsViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return searchResults.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "LanguageTableViewCell") as? LanguageTableViewCell else { return UITableViewCell() }

        let language = searchResults[indexPath.row]

        cell.languageNameLabel.text = language
        return cell
    }
}

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

UISearchBar

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

使用UISearchBar

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

使用UISearchController

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

在navigationItem.titleView中放置UISearchBar与使用navigationItem.searchController属性相比

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

下面是一个如何工作的示例

主视图控制器:

用于显示搜索结果的视图控制器:

class LanguagesSearchResultsViewController: UIViewController {

    // MARK: - Properties

    // Complete list of items to search. If you're doing a network request for your search term then you don't need this.
    let languages = ["Mandarin Chinese", "English", "Hindustani", "Spanish", "Arabic", "Malay", "Russian", "Bengali", "Portuguese", "French", "Hausa", "Punjabi", "German", "Japanese", "Persian", "Swahili", "Telugu", "Javanese", "Wu Chinese", "Korean"]

    // The data source for your search results
    var searchResults: [String] = []

    // MARK: - IBOutlets

    @IBOutlet weak var tableView: UITableView!

    // MARK: - UIViewController methods

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
    }

   (…)
}

// MARK: - UISearchResultsUpdating

extension LanguagesSearchResultsViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        guard let searchText = searchController.searchBar.text else { return }
        searchResults = languages.filter { $0.contains(searchText) }
        tableView.reloadData()
    }
}

// MARK: - UITableViewDataSource

extension LanguagesSearchResultsViewController: UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return searchResults.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "LanguageTableViewCell") as? LanguageTableViewCell else { return UITableViewCell() }

        let language = searchResults[indexPath.row]

        cell.languageNameLabel.text = language
        return cell
    }
}
如果您仍然希望在标题视图中显示搜索栏,请显示/隐藏