Swift UISearchController/导航控制器中的搜索栏
我有一个包含简单数据的TableView。我已经通过代码向导航控制器添加了搜索栏。(我不确定我是否采取了正确的方式,但它正在发挥作用)。这就是它的样子: 代码如下:Swift UISearchController/导航控制器中的搜索栏,swift,Swift,我有一个包含简单数据的TableView。我已经通过代码向导航控制器添加了搜索栏。(我不确定我是否采取了正确的方式,但它正在发挥作用)。这就是它的样子: 代码如下: import UIKit class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! var data = ["Hello","This","Is","Table","View","With","Searc
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元素你可以使用颜色创建的图像来更改背景颜色。试试这个答案: