如何通过编程将搜索栏放置在导航栏中? - Swift

4

我正在使用这个库,我的视图看起来像这样:

带搜索栏的视图

我在homeViewController中添加了一个搜索栏。

HomeViewController

func createSearchBar(){
        searchbar.showsCancelButton = false
        searchbar.placeholder = "searchbartext".localized()
        searchbar.delegate = self
        self.navigationItem.titleView = searchbar
    }

我的问题是:如何在子视图控制器中使用主页视图控制器中的搜索栏?

1个回答

5
您需要创建一个SearchController并将其设置为在另一个TableViewController中显示结果:
ViewController
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()
    }

    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
    }
}

结果表视图控制器

import UIKit

class ResultsTableViewController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate {

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

    var arrayFilter = [String]()

    // 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
    }
}

enter image description here


没问题。如果它解决了你的问题,请将其标记为答案。谢谢。 - GuiDupas
3
在发布到StackOverflow时,请将您的函数名称和注释翻译成英文。 - Cœur
嘿,当我点击一个单元格didselectrow时,perforsegue不起作用。为什么?@GuiDupas - podgradle
你必须实现 didSelectRow 方法。 - GuiDupas
3
我有点困惑这个问题的标题为什么是"How to put search bar in navigation bar programmatically? - Swift",但提供的解决方案是使用Xcode storyboard界面模板。可能是提问者没有理解区别并接受了答案,或者提供解决方案的人回答时没有意识到该解决方案是在storyboard中实例化的。无论如何,对我来说这是误导性的,应该更名。 - CoderQueue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接