Swift - 搜索数据未加载

时间:2015-11-28 02:53:46

标签: swift parse-platform uisearchcontroller

我正在尝试使用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()
    }

}
}

1 个答案:

答案 0 :(得分:0)

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

所以你的查询功能现在看起来像是:

 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()不应该在生命周期viewDidLoad()中,并且不要忘记将query()调用到viewDidLoad()

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

numberOfRowsInSection()方法应该有两个选项,其中过滤器数组从搜索栏返回过滤器对象,或者仅从解析中返回对象。

还应修改cellForRowAtIndexPath,因为您将从过滤器数组或默认数组中返回数据

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