2017-08-03 13 views
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!) 
    } 
} 
+0

'filterContentForSearchText'の中にコードを表示する必要があります。最も可能性の高い原因は、呼び出しの非同期性のために 'allSearchResultOfferings'が更新される前に' reloadData'が呼び出されていることです。 – Michael

+0

メインスレッドで 'reloadData()'を呼び出す必要があります。 'DispatchQueue.main.async {tableView。 reloadData()} ' –

+0

@ NandiinBaoええと、私はmainTreadでreloadData()を呼んでいます。 – itachi

答えて

0

誤警報 - Xcodeを終了して、プロジェクトをきれいにして再構築する必要がありました。それは今の魅力のように機能します。

関連する問題