【问题标题】:How to use custom view controller in UISearchController for results?如何在 UISearchController 中使用自定义视图控制器获取结果?
【发布时间】:2018-02-01 18:50:08
【问题描述】:

我目前正在尝试为应用实现搜索功能。目标是在不同的视图控制器中显示搜索结果。我的意思是这样的:

UISearchController(searchResultsController: myCustomViewControllerHere)

我在教程中找到的所有答案都使用带有数据的当前视图控制器作为显示结果的视图控制器:

UISearchController(searchResultsController: nil)

有人可以帮忙解决这个问题吗?我正在链接一个教程,它在同一个 VC 上显示结果

Tutorial Link

【问题讨论】:

  • 查看 Apple 文档。您可以从那里轻松找到示例代码。

标签: ios iphone swift search uisearchcontroller


【解决方案1】:

您需要创建一个 SearchController 并将其设置为在另一个 TableViewController 中显示结果:

视图控制器

import UIKit

class ViewController: UIViewController, UISearchControllerDelegate {

    var controladorDeBusca: UISearchController!

    var resultsTableViewController: ResultsTableViewController?

    override func viewDidLoad() {
        super.viewDidLoad()

        resultsTableViewController = storyboard!.instantiateViewController(withIdentifier: "resultsTableViewController") as? ResultsTableViewController

        configurarControladorDeBusca()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func configurarControladorDeBusca() {

        controladorDeBusca = UISearchController(searchResultsController: resultsTableViewController)
        controladorDeBusca.delegate = self
        controladorDeBusca.searchResultsUpdater = resultsTableViewController
        controladorDeBusca.dimsBackgroundDuringPresentation = true
        definesPresentationContext = true

        controladorDeBusca.loadViewIfNeeded()

        //Configura a barra do Controlador de busca
        controladorDeBusca.searchBar.delegate = resultsTableViewController
        controladorDeBusca.hidesNavigationBarDuringPresentation = false
        controladorDeBusca.searchBar.placeholder = "Search place"
        controladorDeBusca.searchBar.sizeToFit()
        controladorDeBusca.searchBar.barTintColor = navigationController?.navigationBar.barTintColor
        controladorDeBusca.searchBar.tintColor = self.view.tintColor

        //Adiciona a barra do Controlador de Busca a barra do navegador
        navigationItem.titleView = controladorDeBusca.searchBar
    }
}

ResultsTableViewController

import UIKit

class ResultsTableViewController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate {

    var array = ["Brazil", "Bolivia", "United States", "Canada", "England", "Germany", "France", "Portugal"]

    var arrayFilter = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return arrayFilter.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell", for: indexPath)

        cell.textLabel?.text = arrayFilter[indexPath.row]

        return cell
    }


    func updateSearchResults(for searchController: UISearchController) {


    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

        arrayFilter.removeAll()

        if let text = searchBar.text {
            for string in array {
                if string.contains(text) {
                    arrayFilter.append(string)
                }
            }
        }

        tableView.reloadData()
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {

        arrayFilter.removeAll()
        tableView.reloadData()
    }

    func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {

        arrayFilter.removeAll()
        tableView.reloadData()

        return true
    }
}

希望对你有帮助。

【讨论】:

  • 感谢您的帮助。我有点困惑。如何让过滤后的数据显示在 "ResultadoBuscaLocaisTableViewController" 上?我会以某种方式将数据传递到那里吗?
  • 使用 updateSearchResults 并重新加载 tableView 中的数据
  • 我的投票太大了,贴在这里
  • 那你能发个链接吗?我不知道如何让“ResultadoBuscaLocaisTableViewController”对显示的数据负责。我也不知道这是否与代表等有关?谢谢!
  • 这里。我张贴了ResultadoBuscaLocaisTableViewController class 的洞。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
相关资源
最近更新 更多