1

UITableViewControllerで検索を実装しようとしていますが、既存の配列をフィルタリングするのではなく、APIを呼び出してリモートデータベースの値を検索します。No TableViewで検索結果を表示すると結果が表示されない

textDidChangecellForRowAtIndexPathメソッドが適切な時間に呼び出され、データ配列に必要なすべてのデータが含まれているため、すべてを正しく実装していると思いました。しかし、何も私の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

はそれを手に入れました。問題は、検索バーをストーリーボードにドラッグしたときに、「検索バー」の代わりに「検索バーと検索ディスプレイコントローラ」を選択したことです。 iOS8以降では推奨されていないSearch Display Controllerにより、コードが機能しなくなりました。

したがって、ドキュメントアウトラインから検索ディスプレイコントローラを削除し、アウトレットを新しい検索バーに再接続する必要があり、それが機能しました。誰かを助けることを願っています。

+0

これはあなたの受け入れられた回答としてマークする必要があります。 –

+1

@MaxvonHippelあなたはそれを投稿してから2日後にあなた自身の答えを受け入れることができます – jwitos

+0

ハハオハイオ州オハイオ州オオカミ私は忘れて、申し訳ありません、それは代理人です。私に思い出させてくれてありがとう –