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