【问题标题】:How to update the data from the searchResultsController (UISearchController)如何从 searchResultsController (UISearchController) 更新数据
【发布时间】:2016-06-13 12:19:43
【问题描述】:

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

问题是,一旦我向数组中添加了一个字符串,并进行新的搜索,数组并没有更新为新值!

这是我的代码:

在 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
    }

}

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

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()
    }

【问题讨论】:

    标签: ios swift uitableview search uisearchcontroller


    【解决方案1】:

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

    func updateSearchResultsForSearchController(searchController: UISearchController) {
    
        convertObjectsToArray()
        self.tableView.reloadData()
    
    
    }
    

    【讨论】:

    • 我已经将该函数用作扩展,但这不会将我的数据从一个类传递给另一个类,对吧?
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多