如何更新searchResultsController(UISearchController)中的数据

时间:2016-06-13 12:19:44

标签: ios swift uitableview search uisearchcontroller

所以我使用的是searchResultsController,它接受​​一个字符串数组,并在tableview中显示它们(它是一个自动完成列表)。当用户按下“搜索”键时键盘上的按钮,输入的字符串尚未在我的Tableview中,我想添加它,并相应地更新tableview。

问题是,一旦我向数组中添加了一个String并进行了新的搜索,该数组就不会使用新值进行更新!

这是我的代码:

在Overview.swift类的我的ViewDidLoad()

    class Overview: UIViewController,UISearchControllerDelegate,UISearchBarDelegate,UICollectionViewDelegate,UICollectionViewDataSource {

        var mySearchController : UISearchController! 
        var mySearchBar : UISearchBar!

        override func viewDidLoad() {
            super.viewDidLoad()
        let src = SearchResultsController(data: convertObjectsToArray()) 
            // instantiate a search controller and keep it alive
            mySearchController = UISearchController(searchResultsController: src)
            mySearchController.searchResultsUpdater = src
            mySearchBar = mySearchController.searchBar
        //set delegates
            mySearchBar.delegate = self
            mySearchController.delegate = self
}

这是用于UISearchController

的数据函数
   func convertObjectsToArray() -> [String] {

    //open realm and map al the objects
    let realm = try! Realm()
    let getAutoCompleteItems = realm.objects(AutoComplete).map({$0})

    ...
    return convertArrayStrings // returns [String] with all words
}

因此,当用户按下键盘上的搜索按钮时,我将该单词保存到我的数据库中。

现在我需要将convertObjectsToArray()的更新版本放在我的searchResultsController中,但我还没有找到如何执行此操作。欢迎所有帮助

最后,但并非最不重要的是,我的SearchResultsController类,在我的Overview.swift类的viewDidLoad中使用。

    class SearchResultsController : UITableViewController {
    var originalData : [String]
    var filteredData = [String]()

    init(data:[String]) {
        self.originalData = data
        super.init(nibName: nil, bundle: nil)
    }

    required init(coder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell")
    }


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.filteredData.count

    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        cell.textLabel!.text = self.filteredData[indexPath.row]          
        return cell
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        clickedInfo = filteredData[indexPath.row]    
    }



    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

}

为了在tableview中过滤我的单词(当用户输入内容时,只显示匹配的字符串),我使用以下扩展名。

extension SearchResultsController : UISearchResultsUpdating {
    func updateSearchResultsForSearchController(searchController: UISearchController) {
        let sb = searchController.searchBar
        let target = sb.text!
        self.filteredData = self.originalData.filter {
            s in
            let options = NSStringCompareOptions.CaseInsensitiveSearch
            let found = s.rangeOfString(target, options: options)
            return (found != nil)
        }
        self.tableView.reloadData()
    }

1 个答案:

答案 0 :(得分:0)

我可以使用搜索控制器的更新功能:

func updateSearchResultsForSearchController(searchController: UISearchController) {

    convertObjectsToArray()
    self.tableView.reloadData()


}