Search code examples
iosuitableviewios7uisearchdisplaycontroller

search display controller update table view


I'm making an app, which destination iOS is 7.0. So I use search display controller. When i try to search, i make an api request, and it's results are coming later, than search display controller updates table view. So it's empty, though i have results of search. I've tried something like

self.searchDisplayController?.searchResultsTableView.reloadData()

straight after reaching data from request, but it's not working.

Here is my logic:

  func filterContextForSearchText(searchText: String) {
    BooksWorker.searchForBooks(searchText) { foundBooks in
      self.foundBooks = foundBooks
      if BooksWorker.books != nil {
        self.filteredBooks = BooksWorker.books.filter { book in
          return (book.name?.lowercaseString.containsString(searchText.lowercaseString))!
        }
      }
      self.searchDisplayController?.searchResultsTableView.reloadData()
    }
  }

  func searchDisplayController(controller: UISearchDisplayController, shouldReloadTableForSearchString searchString: String?) -> Bool {
    isSearch = true
    filterContextForSearchText(searchString!)
    return true
  }

I update my tableView in such a way:

  override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isSearch {
      tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine
      return filteredBooks.count
    } else {
      if BooksWorker.books != nil {
        tableView.separatorStyle = UITableViewCellSeparatorStyle.SingleLine
        return (BooksWorker.books?.count)!
      } else {
        showEmptyTableView()
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        return 0
      }
    }
  }

  override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 100
  }

  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if isSearch {
      let cell = tableView.dequeueReusableCellWithIdentifier(AppData.CellIdentifiers.UndownloadedBookCell) as! UndownloadedBookCell
      print("making cell")
      cell.setBook(foundBooks[indexPath.row])
      cell.delegate = self
      return cell
    } else {
      let cell = tableView.dequeueReusableCellWithIdentifier(AppData.CellIdentifiers.BookCell) as! BookCell
      cell.setBook(BooksWorker.books![indexPath.row])
      return cell
    }
  }

Does anybody having an idea?


Solution

  • you should update tableView not searchDisplay self.tableView.reloadData()