ios - La búsqueda inteligente de nombres de usuario de Parse en Swift no funciona
parse.com parse-platform (1)
Deberá implementar el protocolo UISearchResultsUpdating para lograr esto. Utiliza un UISearchController (introducido en iOS 8) que debe agregarse mediante programación en lugar de a través del guión gráfico, pero no se preocupe, es bastante sencillo.
Esto debería hacer el trabajo por ti
Saludos, Russell
class YourTableViewController: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating {
var searchUsers: [PFUser] = [PFUser]()
var userSearchController = UISearchController()
var searchActive: Bool = false
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
self.userSearchController = UISearchController(searchResultsController: nil)
self.userSearchController.dimsBackgroundDuringPresentation = true
// This is used for dynamic search results updating while the user types
// Requires UISearchResultsUpdating delegate
self.userSearchController.searchResultsUpdater = self
// Configure the search controller''s search bar
self.userSearchController.searchBar.placeholder = "Search for a user"
self.userSearchController.searchBar.sizeToFit()
self.userSearchController.searchBar.delegate = self
self.definesPresentationContext = true
// Set the search controller to the header of the table
self.tableView.tableHeaderView = self.userSearchController.searchBar
}
// MARK: - Parse Backend methods
func loadSearchUsers(searchString: String) {
var query = PFUser.query()
// Filter by search string
query.whereKey("username", containsString: searchString)
self.searchActive = true
query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in
if (error == nil) {
self.searchUsers.removeAll(keepCapacity: false)
self.searchUsers += objects as! [PFUser]
self.tableView.reloadData()
} else {
// Log details of the failure
println("search query error: /(error) /(error!.userInfo!)")
}
self.searchActive = false
}
}
// MARK: - Search Bar Delegate Methods
func searchBarSearchButtonClicked(searchBar: UISearchBar) {
// Force search if user pushes button
let searchString: String = searchBar.text.lowercaseString
if (searchString != "") {
loadSearchUsers(searchString)
}
}
func searchBarCancelButtonClicked(searchBar: UISearchBar) {
// Clear any search criteria
searchBar.text = ""
// Force reload of table data from normal data source
}
// MARK: - UISearchResultsUpdating Methods
// This function is used along with UISearchResultsUpdating for dynamic search results processing
// Called anytime the search bar text is changed
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchString: String = searchController.searchBar.text.lowercaseString
if (searchString != "" && !self.searchActive) {
loadSearchUsers(searchString)
}
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (self.userSearchController.active) {
return self.searchUsers.count
} else {
// return whatever your normal data source is
}
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("userCell") as! UserCell
if (self.userSearchController.active && self.searchUsers.count > indexPath.row) {
// bind data to the search results cell
} else {
// bind data from your normal data source
}
return cell
}
// MARK: - UITableViewDelegate
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
if (self.userSearchController.active && self.searchUsers.count > 0) {
// Segue or whatever you want
} else {
// normal data source selection
}
}
}
Estoy tratando de tener una búsqueda inteligente en mi aplicación iOS para que cuando un usuario escriba un personaje en una UISearchBar, los resultados se actualicen automáticamente en la vista de tabla debajo de la barra de búsqueda. Por alguna razón, la función searchBar con textDidChange no se llama cuando escribo un carácter en la barra de búsqueda. Se llama después de escribir 2 caracteres. Por lo tanto, mis resultados de búsqueda siempre están 1 paso por detrás de lo que se escribe en la barra de búsqueda. Y también parece que la función de búsqueda () se llama dos veces cada vez. ¿Algunas ideas?
//FUNC: search
func search(searchText: String? = nil){
if searchText == nil || searchText == "" {
println("No users found.")
} else {
var query = PFUser.query()
//MAKE CASE INSENSTIVE
query!.whereKey("username", containsString: searchText!)
query!.findObjectsInBackgroundWithBlock { (results, error) -> Void in
if error != nil {
println(error)
} else {
if let res = results {
self.data = res as? [PFUser]
}
}
}
}
self.tableView.reloadData()
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
let user = data[indexPath.row] as! PFUser
let username = user.username
println(username)
cell.textLabel?.text = username
return cell
}
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
search(searchText: searchText)
searchActive = false;
}