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

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

}
}

person Community    schedule 28.11.2015    source источник


Ответы (1)


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

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

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

person Lamour    schedule 28.11.2015
comment
Привет @Lamour Спасибо за ваш ответ, я попробовал то, что вы упомянули, но все еще не могу заставить его работать. Я также нашел этот учебник: youtube.com/watch?v=AXbxBYcj_vI как вы думаете, что это может сработать? - person ; 28.11.2015
comment
Что не работает? Или на самом деле вы должны попытаться закомментировать весь код фильтра, а затем попытаться запустить код, чтобы увидеть, работает ли то, что у вас есть. - person Lamour; 28.11.2015
comment
вам следует попробовать свой код без фильтра part@Charles - person Lamour; 28.11.2015
comment
Я предполагаю, что фильтр - это бит функционального запроса, который вы добавили? Я только что попробовал это, он загружает и т. Д. И делает все, кроме поиска? - person ; 28.11.2015
comment
Теперь я получаю две ошибки: 1) Тип «SearchTableViewController» не соответствует протоколу «UISearchResultsUpdating». - person ; 28.11.2015
comment
2) func для cellForRowAtIndePpath: определение конфликтует с предыдущим значением - person ; 28.11.2015
comment
Вы можете поделиться этим проектом. так что я мог бы помочь вам немного, пока у меня есть время? - person Lamour; 28.11.2015
comment
Хотите, чтобы я поделился с вами проектом? так ты видишь? - person ; 28.11.2015
comment
да, если вы хотите, а также перестаньте публиковать один и тот же вопрос в stackoverflow - person Lamour; 28.11.2015
comment
извините за задержку... попробуйте эту ссылку dropbox.com/sh/3qehgdk33kawbj8/ AADjO62lr1jWuwfJtSPjZtVla?dl=0, если нет, загрузите его отсюда: veasoftware.com/tutorials/2015/6/27/ и просто добавьте мой код.. - person ; 28.11.2015
comment
У меня есть друг, чтобы загрузить его в Dropbox, но не уверен, что это сработает ... лучше всего получить его от Veasoftware - person ; 28.11.2015
comment
перейти в чат stackoverfow найти эту комнату CheckerHelp - person Lamour; 28.11.2015
comment
Я не могу болтать! вам нужно более 20 репутации - person ; 28.11.2015