ios - 创建 SearchController 以供重复使用

标签 ios swift xcode uisearchcontroller

是否可以创建 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),但我不明白如何正确使用协议(protocol)。

最佳答案

有很多方法可以做到这一点,使用协议(protocol)是一个很好的方法,但您也可以子类化 UIViewController 并创建一个 BaseSearchableViewController ,您可以在其中添加您想要的所有功能需要您的搜索,那么,您只需从 BaseSearchableViewController 而不是 UIViewController 子类化。

关于ios - 创建 SearchController 以供重复使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648201/

相关文章:

ios - 了解 React Native 中的默认字体大小

ios - 将 SKShapeNode 转换为 SKSpriteNode 的最佳方法

swift - 在 RealityKit 中将对象放置在相机前面

ios - 使用 Icon 创建标签实用程序

ios - 如何重写 iOS 纯 swift 拷贝构造函数

objective-c - 如何在 NSMutableArray 中存储 CGContext 状态?

iphone - 我怎样才能捕捉到 MapView 上的点击,然后将它传递给默认的手势识别器?

ios - 如何修复 CFNetwork iOS swift 问题?

ios - 初学IOS开发——如何摆脱我不小心添加的 Controller

xcode - 如何点击 tvOS 模拟器中的选项卡?