首页 > 解决方案 > 使搜索栏通知 viewController 用户即将搜索

问题描述

我正在我的应用程序中实现搜索功能。该应用程序由一个视图控制器和一个处理搜索逻辑的自定义类组成。这个自定义类称为SearchController.

UISearchBarDelegate我的目标是让 searchBar 在用户即将开始搜索时通知视图控制器(与method完全相同的行为searchBarShouldBeginEditing)。

通常,您只需searchBarShouldBeginEditing在内部声明,SearchController但我试图从内部调用此方法,viewController因为我希望在此事件发生时更改视图中的某些内容(因此应该由 viewController 处理它,而不是 searchController)。

SearchController班级:

class SearchController: NSObject, UISearchBarDelegate {

    let searchBar = UISearchBar()
    var searchButton = UIBarButtonItem? = nil

    /* Other irrelevant class properties */

    func setup() {
        searchBar.delegate = self
        /* other setup */
    }
}

ViewController班级:

class ViewController: UIViewController {

    private let searchController = SearchController()  

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.delegate = self
        searchController.setup()
    }

    /* setup a tableview to display results... this part of the implementation works fine */
}

我省略了这两个类中的大部分,因为搜索功能已经可以使用。我唯一苦苦挣扎的事情是找到一种方法来让viewController用户知道何时开始在搜索字段中输入内容。

我尝试制作viewController实现UISearchBarDelegate,但我已经在制作SearchController实现UISearchBarDelegate,为什么我不能访问里面的委托方法viewController

我希望我说清楚了,如有必要,我可以进一步澄清这篇文章。我一直在扯头发,试图自己解决这个问题。

标签: iosswiftprotocols

解决方案


好的,asearchBar不能有 2 个代表,所以你必须想办法解决这个问题。

解决此问题的一种方法是:

protocol SearchControllerDelegate: class{
    func searchBarDidBeginEditing()
}

class SearchController: NSObject, UISearchBarDelegate {

    weak var delegate: SearchControllerDelegate?

    private let searchBar = UISearchBar()

    func setup() {
        searchBar.delegate = self
    }

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        delegate?.searchBarDidBeginEditing()
    }

}

class ViewController: UIViewController, SearchControllerDelegate{

    var searchController = SearchController()
    func setUP(){
        self.searchController.delegate = self
    }

    func searchBarDidBeginEditing() {
        /// perform some action here
    }

}

推荐阅读