1
Instagramのような検索ページを実装しています - 検索タブに行くと、(動的セクションを含む)傾向検索が表示されますが、検索ボックスに入力を開始すると傾向検索が終了し、検索結果が表示されます。iOS UITableViewは検索時にデータをリロードしません
私はそれだけでしたが、うまくいかないようです。 A)何かを検索すると結果が表示されません(APIコールからの応答をログに記録します - データを正しく取得しています)。 B)私はキャンセル私がヒットした後でも結果をトレンド表示するには戻っていない(繰り返しますが、私はcancelSearchアクションで印刷し、関数が確実に呼び出されている)
は、ここに私のコードの簡易版です。
class SearchVC: UITableViewController {
let searchController = UISearchController(searchResultsController: nil)
var sections = [String]()
var allTrendingOfferings = [[OfferingModel]]()
var allSearchResultOfferings = [OfferingModel]()
override func viewDidLoad() {
super.viewDidLoad()
sections = // data from backend
allTrendingOfferings = // data from backend
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if (searchController.isActive) {
return ""
}
return self.sections[section]
}
override func numberOfSections(in tableView: UITableView) -> Int {
if (searchController.isActive) {
return 1
}
return self.sections.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if (searchController.isActive) {
return allSearchResultOfferings.count
}
return allTrendingOfferings[section].count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "offeringCell", for: indexPath) as! SeachTVCell
if (searchController.isActive) {
let offering = allSearchResultOfferings[indexPath.row]
} else {
let offering = allTrendingOfferings[indexPath.section][indexPath.row]
}
// configure cell and
return cell
}
func filterContentForSearchText(searchText: String, scope: String = "All") {
allSearchResultOfferings = // data fetched from backend
self.tableView.reloadData() // done asynchronously (after receiving data)
}
func searchCancel() {
self.tableView.reloadData()
}
}
extension SearchVC: UISearchResultsUpdating {
@available(iOS 8.0, *)
func updateSearchResults(for searchController: UISearchController){
if !searchController.isActive {
searchCancel()
}
filterContentForSearchText(searchText:searchController.searchBar.text!)
}
}
'filterContentForSearchText'の中にコードを表示する必要があります。最も可能性の高い原因は、呼び出しの非同期性のために 'allSearchResultOfferings'が更新される前に' reloadData'が呼び出されていることです。 – Michael
メインスレッドで 'reloadData()'を呼び出す必要があります。 'DispatchQueue.main.async {tableView。 reloadData()} ' –
@ NandiinBaoええと、私はmainTreadでreloadData()を呼んでいます。 – itachi