Swift - 搜索数据未加载

Swift - Search data not loading

我正在尝试使用 Parse 向我的应用程序添加搜索功能,我已经用 UISearchController 编写了代码,但是由于某种原因,当我加载应用程序并尝试搜索时,没有任何效果。我的解析都设置正确,所以我的代码一定有问题!

这里是:

import UIKit
import Parse
class SearchTableViewController: UITableViewController, UISearchResultsUpdating
{

    var searchResults = [String]()

    var resultSearchController = UISearchController()

    override func viewDidLoad()
    {super.viewDidLoad()
        self.resultSearchController = UISearchController(searchResultsController: nil)
        self.resultSearchController.searchResultsUpdater = self
        self.resultSearchController.dimsBackgroundDuringPresentation = false
        self.resultSearchController.searchBar.sizeToFit()
        self.tableView.tableHeaderView = self.resultSearchController.searchBar

    }

    override func didReceiveMemoryWarning()
    {super.didReceiveMemoryWarning()
    }



    func query()
    {
        let query = PFQuery(className:"_User")
        query.findObjectsInBackgroundWithBlock { (results: [PFObject]?, error: NSError?) -> Void in
            if error != nil {
                if let objects = results! as [PFObject]! {
                    for object in objects {
                        let userName = object.objectForKey("firstName") as! String
                        self.searchResults.append(userName)
                        self.tableView.reloadData()   //<-- must reloadData()
                    } } }
        }





    // MARK: - Table view data source
 func numberOfSectionsInTableView(tableView: UITableView) -> Int
    {
        return 1
    }

   func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        return searchResults.count
    }
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)

        cell.textLabel?.text = searchResults[indexPath.row]

        return cell
    }



   func updateSearchResultsForSearchController(searchController: UISearchController)
    {
        self.searchResults.removeAll(keepCapacity: false)

        let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
        let array = (self.searchResults as NSArray).filteredArrayUsingPredicate(searchPredicate)
        self.searchResults = array as! [String]

        self.tableView.reloadData()
    }

}
}

首先,我不认为直接从解析中过滤是个好主意。最好从解析中下载所有内容,然后过滤该数据。

所以您的查询函数现在看起来像:

 func query()
{
   let query = PFQuery(className:"_User")
   query.findObjectsInBackgroundWithBlock { (results: [PFObject]?, error: NSError?) -> Void in
    if error != nil {
        if let objects = results! as [PFObject]! {
        for object in objects {
            let userName = object.["firstname"] as! String
            self.searchResults.append(userName)
           self.tableView.reloadData()   //<-- must reloadData()
        } } }
 }

所以现在您的数组包含来自解析的所有用户的名字

self.tableView.reloadData() should not be in the life cycle viewDidLoad(), and don't forget to call query() into viewDidLoad()

您应该创建另一个数组来保存过滤器的结果。

numberOfRowsInSection() 方法应该有两个选项,过滤器数组 returns 过滤来自搜索栏的对象或仅来自解析的对象。

并且 cellForRowAtIndexPath 也应该修改,因为您将 return 来自过滤数组或默认数组的数据

我相信你应该仔细阅读本教程,看看他们的过滤器代码是如何工作的enter link description here