1

Я пытаюсь реализовать поиск в UITableViewController, но не на основе фильтрации существующего массива, а вместо вызова моего API для поиска значений в удаленной базе данных.Нет результатов при показе результатов поиска в TableView - swift

Я думал, что все реализовано правильно, потому что мои методы textDidChange и cellForRowAtIndexPath вызываются своевременно, а в моем массиве данных есть все необходимые мне данные. НО - ничего не отображается в моем TableView! Он всегда говорит «Нет результатов». Я не могу найти какие-либо существующие решения на SO, поскольку многие классы были устаревшими в iOS 8, и я борюсь с внедрением последних. Любая помощь ценится! Мой код:

class QuestionsController: UITableViewController, UISearchResultsUpdating, UISearchBarDelegate { 

    @IBOutlet weak var searchBar: UISearchBar! 
    var searchController = UISearchController() 
    var searchText: String? 
    var areSearchResultsExhausted: Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.searchController = UISearchController(searchResultsController: self) 
     self.searchBar.delegate = self 
     self.searchController.searchResultsUpdater = self 
     self.searchController.hidesNavigationBarDuringPresentation = false 
     self.searchController.dimsBackgroundDuringPresentation = false 
     self.searchController.searchBar.sizeToFit() 
     self.getQuestionsData(0, searchText: nil) 
    } 

    var questionsDataObjects = [Question]() 

    // MARK: - Get data from API 
    func getQuestionsData(startFromQuestionId: Int, searchText: String?) { 
     // Getting data from API stuff like: 
     let task = session.dataTaskWithRequest(req) { ... } 
     questionsDataObjects.append(...) 
     self.tableView.reloadData() 
    } 

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return questionsDataObjects.count 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("QuestionCell", forIndexPath: indexPath) as! BasicQuestionCell 

     // Populate the table view cells 
     let questionCell = questionsDataObjects[indexPath.row] 
     cell.titleLabel.text = questionCell.content 

     // Load more results when user scrolled to the end 
     if (indexPath.row == questionsDataObjects.count-1 
      && questionsDataObjects.count > indexPath.row 
      && !areSearchResultsExhausted) { 
      print("qDO.count: \(questionsDataObjects.count) ; indexPath.row: \(indexPath.row)") 
      self.getQuestionsData(indexPath.row + 1, searchText: self.searchText) 
     } 

     return cell 
    } 

    // Handle searching 
    func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 
     self.searchText = searchText 
     self.areSearchResultsExhausted = false 
     questionsDataObjects.removeAll() 
     self.getQuestionsData(0, searchText: searchText) 
     tableView.reloadData() 
    } 

    func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
     self.searchText = nil 
     self.areSearchResultsExhausted = false 
     questionsDataObjects.removeAll() 
     self.getQuestionsData(0, searchText: searchText) 
    } 

    func updateSearchResultsForSearchController(searchController: UISearchController) { 

    } 

еще две важные вещи:

1) updateSearchResultsForSearchController никогда не вызывается!

2) У меня есть ошибка в консоли, которая говорит: Attempting to load the view of a view controller while it is deallocating is not allowed and may result in undefined behavior (<UISearchController...>), но когда я попытался решить эту проблему, мой поиск бар перестал работать ПОЛНОСТЬЮ ...

ответ

2

Понял. Проблема заключалась в следующем: когда я перетащил строку поиска в Storyboard, я выбрал «Панель поиска и поисковый контроллер дисплея» вместо «панели поиска». Search Display Controller, устаревший в iOS8 и более поздних версиях, запустил код.

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

+0

Вы должны отметить это как свой принятый ответ. –

+1

@MaxvonHippel вы можете принять свой собственный ответ только через 2 дня после его отправки – jwitos

+0

Ха-ха, о, извините, я забыл, это вещь для репрессий. Спасибо за напоминание –