如何从 searchResultsController (UISearchController) 更新数据

Posted

技术标签:

【中文标题】如何从 searchResultsController (UISearchController) 更新数据【英文标题】:How to update the data from the 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()
    

【问题讨论】:

【参考方案1】:

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

func updateSearchResultsForSearchController(searchController: UISearchController) 

    convertObjectsToArray()
    self.tableView.reloadData()



【讨论】:

我已经将该函数用作扩展,但这不会将我的数据从一个类传递给另一个类,对吧?

以上是关于如何从 searchResultsController (UISearchController) 更新数据的主要内容,如果未能解决你的问题,请参考以下文章

SearchResultsController 出现在 UINavigationBar

无法将视图推送到 searchResultsController

UISearchController:searchResultsController 不显示

SearchResultsController 与 UINavigationItem 一起使用时会遮挡屏幕

显示 searchResultsController 时出现 UISearchBar AutoLayout 错误

在 SearchBar Tap 上显示 UISearchController 的 SearchResultsController