创建可重用的 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的主要内容,如果未能解决你的问题,请参考以下文章

创建可重用的 SearchController

是否可以为 useSelector 创建一个可重用的函数?

如何创建可重用的 Twig 组件

为可重用的 Django 应用程序创建迁移

如何创建复制现有指令的可重用 AngularJs 指令

创建可重用的 Django 应用程序?