UITableViewController
で検索を実装しようとしていますが、既存の配列をフィルタリングするのではなく、APIを呼び出してリモートデータベースの値を検索します。No TableViewで検索結果を表示すると結果が表示されない
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...>)
をしかし、私はこの問題を解決しようとしたとき、私の検索バーが完全に動作を停止し...
これはあなたの受け入れられた回答としてマークする必要があります。 –
@MaxvonHippelあなたはそれを投稿してから2日後にあなた自身の答えを受け入れることができます – jwitos
ハハオハイオ州オハイオ州オオカミ私は忘れて、申し訳ありません、それは代理人です。私に思い出させてくれてありがとう –