Swift - 搜索数据未加载

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

}
}

最佳答案

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

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

 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() 方法应该有两个选项,其中过滤器数组返回来自搜索栏的过滤器对象或仅来自解析的对象。

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

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

关于Swift - 搜索数据未加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33967178/

相关文章:

ios - 调用 SwiftUIApp.init() 时的实例?

ios - 如何在 IOS 中使用解析进行 PFRelation 或关系数据库查询

ios - 如果 UISearchDisplayController 被弃用,那么带有搜索显示 Controller 的搜索栏有什么用呢?

ios - 将照片库中的图像加载到我的 UIImageView 中,但重新启动应用程序时图像不会更改

ios - NSDataBase64DecodingOptions 总是返回 nil

ios - 使用 NSAttributedString 的 UILabel 的 NSForegroundColorAttributeName

arrays - 解析: Download array in swift

ios - 解析将 PFUser 传递给 Watch 扩展

swift - 如何在不像 Whatsapp 那样遮挡整个屏幕的情况下禁用 tableview?

ios - 如何防止 UISearchController 显示导航栏?