创建可重用的 SearchController
Posted
技术标签:
【中文标题】创建可重用的 SearchController【英文标题】:Create SearchController for reusable use 【发布时间】:2020-01-08 14:40:04 【问题描述】:是否可以创建 UISearchController 以在许多类中重复使用?
在新类中使用最少的代码。
现在我在所有类中都有代码,但我想在所有类中使用最少的代码来调用searchController
:
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate
@IBOutlet weak var tableView: UITableView!
var photoBook: [PhotoBooking] = []
var filteredBook: [PhotoBooking] = []
private var searchController = UISearchController(searchResultsController: nil)
private var searchBarIsEmpty: Bool
guard let text = searchController.searchBar.text else return false
return text.isEmpty
private var isFiltering: Bool
return searchController.isActive && !searchBarIsEmpty
override func viewDidLoad()
super.viewDidLoad()
configureSearchController()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if isFiltering
return filteredBook.count
return photoBook.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
var pBook: PhotoBooking
if isFiltering
pBook = filteredBook[indexPath.row]
else
pBook = photoBook[indexPath.row]
cell.textLabel?.text = pBook.invoiceID
cell.detailTextLabel?.text = pBook.contactInfo["surname"] as! String
return cell
private func configureSearchController()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.searchBar.barTintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
searchController.dimsBackgroundDuringPresentation = false
searchController.searchBar.delegate = self
tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
extension AllPhotoBookingsViewController: UISearchResultsUpdating
func searchBarSearchButtonClicked(_ searchBar: UISearchBar)
filterContentForSearchText(searchBar.text!)
tableView.reloadData()
func updateSearchResults(for searchController: UISearchController)
filterContentForSearchText(searchController.searchBar.text!)
tableView.reloadData()
private func filterContentForSearchText(_ searchText: String)
filteredBook = photoBook.filter( (book: PhotoBooking) -> Bool in
let name = book.contactInfo["name"] as! String
let surname = book.contactInfo["surname"] as! String
let invoice = book.invoiceID
return invoice.localizedCaseInsensitiveContains(searchText) ||
name.localizedCaseInsensitiveContains(searchText) ||
surname.localizedCaseInsensitiveContains(searchText)
)
tableView.reloadData()
func searchBarTextDidEndEditing(_ searchBar: UISearchBar)
navigationController?.hidesBarsOnSwipe = false
可能需要使用protocol
,但我不明白如何正确使用协议。
【问题讨论】:
我猜this 应该可以帮助您(自定义您的UISearchController
并准备重用)
【参考方案1】:
有很多方法可以做到这一点,使用协议是一种很好的方法,但您也可以将UIViewController
子类化并创建一个BaseSearchableViewController
,您可以在其中添加搜索所需的所有功能,然后,您只需子类来自BaseSearchableViewController
而不是UIViewController
。
【讨论】:
我给了你一种不用协议的方法,我认为我无法在这个答案中解释协议的全部功能。以上是关于创建可重用的 SearchController的主要内容,如果未能解决你的问题,请参考以下文章