我正在尝试使用 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/