Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Swift - данные поиска не загружаются

Автор вопроса: CommunityОтветов: 1

Я пытаюсь добавить функцию поиска в свое приложение с помощью 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()
    }

}
}

swiftparse-platformuisearchcontroller

Ответы

Ответ 1 · Lamour

во-первых, я не думаю, что фильтровать напрямую из синтаксического анализа - хорошая идея. Было бы лучше загрузить все из парсера, а затем фильтровать эти данные.

Итак, ваша функция запроса теперь будет выглядеть так:

 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 ссылка на описание здесь.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы