Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift UISearchController/导航控制器中的搜索栏_Swift - Fatal编程技术网

Swift UISearchController/导航控制器中的搜索栏

Swift UISearchController/导航控制器中的搜索栏,swift,Swift,我有一个包含简单数据的TableView。我已经通过代码向导航控制器添加了搜索栏。(我不确定我是否采取了正确的方式,但它正在发挥作用)。这就是它的样子: 代码如下: import UIKit class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var data = ["Hello","This","Is","Table","View","With","Searc

我有一个包含简单数据的TableView。我已经通过代码向导航控制器添加了搜索栏。(我不确定我是否采取了正确的方式,但它正在发挥作用)。这就是它的样子:

代码如下:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    var data = ["Hello","This","Is","Table","View","With","Search","Bar","Included","In","NavBar","But","SearchBar","Is","Not","Done","Properly"]
    var filtered = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()
        //My original array and filtered arrays.
        filtered = data
        // Here a play with preferences add/delete 
        let searchBar = UISearchController(searchResultsController: nil)
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.searchController = searchBar
       navigationItem.searchController?.dimsBackgroundDuringPresentation = false
        navigationItem.searchController?.searchResultsUpdater = self
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = filtered[indexPath.row]
        return cell
    }

}

extension ViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        if searchController.searchBar.text! == "" {
            filtered = data
        }
        else {
            filtered = data.filter  {$0.lowercased().contains(searchController.searchBar.text!.lowercased())}
            }
        self.tableView.reloadData()
    }

}
navigationItem.searchController?.searchBar.tintColor = .white
navigationItem.searchController?.searchBar.barTintColor = .red
正如您所看到的,我通过创建SearchController,然后将其添加到NavController中来完成。 还实现了委托UISearchResultsUpdated方法来搜索和筛选

我尝试了几种方法,但我不知道如何访问SearchBar和NavController的属性。(不是通过故事板)

一些截图:

在经历了一天的搜索和尝试之后,我并不确定这一点,因为有些方法有效,但有些方法无效。例如:

这是有效的:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    var data = ["Hello","This","Is","Table","View","With","Search","Bar","Included","In","NavBar","But","SearchBar","Is","Not","Done","Properly"]
    var filtered = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()
        //My original array and filtered arrays.
        filtered = data
        // Here a play with preferences add/delete 
        let searchBar = UISearchController(searchResultsController: nil)
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.searchController = searchBar
       navigationItem.searchController?.dimsBackgroundDuringPresentation = false
        navigationItem.searchController?.searchResultsUpdater = self
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = filtered[indexPath.row]
        return cell
    }

}

extension ViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        if searchController.searchBar.text! == "" {
            filtered = data
        }
        else {
            filtered = data.filter  {$0.lowercased().contains(searchController.searchBar.text!.lowercased())}
            }
        self.tableView.reloadData()
    }

}
navigationItem.searchController?.searchBar.tintColor = .white
navigationItem.searchController?.searchBar.barTintColor = .red
这不起作用:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    var data = ["Hello","This","Is","Table","View","With","Search","Bar","Included","In","NavBar","But","SearchBar","Is","Not","Done","Properly"]
    var filtered = [String]()
    override func viewDidLoad() {
        super.viewDidLoad()
        //My original array and filtered arrays.
        filtered = data
        // Here a play with preferences add/delete 
        let searchBar = UISearchController(searchResultsController: nil)
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.searchController = searchBar
       navigationItem.searchController?.dimsBackgroundDuringPresentation = false
        navigationItem.searchController?.searchResultsUpdater = self
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

extension ViewController: UITableViewDataSource, UITableViewDelegate {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel?.text = filtered[indexPath.row]
        return cell
    }

}

extension ViewController: UISearchResultsUpdating {
    func updateSearchResults(for searchController: UISearchController) {
        if searchController.searchBar.text! == "" {
            filtered = data
        }
        else {
            filtered = data.filter  {$0.lowercased().contains(searchController.searchBar.text!.lowercased())}
            }
        self.tableView.reloadData()
    }

}
navigationItem.searchController?.searchBar.tintColor = .white
navigationItem.searchController?.searchBar.barTintColor = .red
那么,为什么我可以访问一个属性而不能访问另一个? 这是一个非常简单的功能,但很难找到

也许你可以给我一些资源,我可以用在我的情况下,如图所示? 或者,如果你有一个时间-一些解决方案,也许根的例子

提前谢谢


将继续搜索。

此答案有用吗感谢链接和努力。是的,我已经设法修复了一些案例,但还不知道如何改变背景。谢谢。我想你可以用setBackgroundImage来实现这一点,只需使用颜色值。你的意思是我可以将图像添加到搜索栏中,使其搜索字段变为白色?我已经很久没有这样做了,一些UI元素你可以使用颜色创建的图像来更改背景颜色。试试这个答案: